Swig -outdir 选项不包含 .so 文件
我有一个小项目,使用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这两个文件没有都在
- 把
目录添加到 中。 - 把.so文件复制到
,或者用CMake系统创建一个符号链接。 - 不设置
变量,这样所有文件都会在 中创建,然后只把这个位置添加到 。
但是这些做法似乎都不太合理,因为
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})
...