Swig -outdir 选项不包含 .so 文件

4 投票
1 回答
1074 浏览
提问于 2025-04-18 17:37

我有一个小项目,使用CMake系统把C++文件变成Python模块。在CMakeLists.txt文件中,我集成了Swig,具体如下:

# only the Swig part here
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})

find_package(PythonLibs)
include_directories(${PYTHON_INCLUDE_PATH})

set(CMAKE_SWIG_OUTDIR ${PROJECT_BINARY_DIR}/../lib/Foo)

SET_SOURCE_FILES_PROPERTIES(swig/interface.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties(swig/interface.i SWIG_FLAGS "-includeall;-c++;-shadow")
swig_add_module(Foo python swig/interface.i code/foo.cpp)
swig_link_libraries(Foo foolib ${PYTHON_LIBRARIES})

我第一个问题是,为什么Foo.py和_Foo.so这两个文件没有都在指定的位置创建?只有.py文件在那个目录下生成,而.so文件却还是在的位置。难道这是CMake的UseSWIG.cmake文件的一个bug吗?结果是,如果我只把放在环境变量里,我就无法在Python中加载这个模块。为了解决这个问题,我可以选择:

  1. 目录添加到中。
  2. 把.so文件复制到,或者用CMake系统创建一个符号链接。
  3. 不设置变量,这样所有文件都会在中创建,然后只把这个位置添加到

但是这些做法似乎都不太合理,因为应该用来输出.py和.so文件。我是不是漏掉了什么?

1 个回答

2

我不太明白为什么 CMAKE_SWIG_OUTDIR 这个设置没有影响到 .so 文件生成的位置。不过,我可以告诉你一个更简单、更清晰的方法来指定 .so 文件应该生成在哪里。

在你使用 swig_add_module(Foo ...) 之后,CMake 会创建一个叫 _Foo 的目标。你可以修改这个目标的属性,改变它生成库文件(.so 文件)的位置 - 也就是用 set_target_properties(.. LIBRARY_OUTPUT_DIRECTORY <so_file_output_dir>) 来设置。


所以在你的代码中,只需要添加下面的 set_target_properties(..) 这一行:

...
swig_add_module(Foo python swig/interface.i code/foo.cpp)
set_target_properties(_Foo PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SWIG_OUTDIR})
swig_link_libraries(Foo foolib ${PYTHON_LIBRARIES})
...

撰写回答