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

时间:2014-08-18 07:34:00

标签: python cmake swig

我有一个小项目,我使用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})

我的第一个问题是为什么不在CMAKE_SWIG_OUTDIR指定的位置创建Foo.py _Foo.so?仅在该目录中创建.py文件。这是CMake UseSWIG.cmake文件的错误吗? .so文件仍在PROJECT_BINARY_DIR位置。因此,如果只有位置CMAKE_SWIG_OUTDIR位于PYTHON_PATH环境变量中,我就无法在Python中加载模块。所以为了解决这个问题,我可以:

  1. PROJECT_BINARY_DIR目录添加到PYTHON_PATH
  2. 将.so文件复制到CMAKE_SWIG_OUTDIR或使用CMake系统创建符号链接。
  3. 不要设置CMAKE_SWIG_OUTDIR变量,以便在PROJECT_BINARY_DIR中创建所有内容,并仅将此位置添加到PYTHON_PATH
  4. 但这些似乎都不是逻辑上的事情,因为CMAKE_SWIG_OUTDIR应该用来输出.py和.so文件。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我不确定为什么 CMAKE_SWIG_OUTDIR不会影响生成.so文件的位置。但是,我可以告诉您一种更简单,更清晰的方法来指示.so文件应该生成的位置。

swig_add_module(Foo ...)之后,会创建一个名为_Foo的CMake目标。然后,您可以编辑目标的属性并更改其库(.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})
...
相关问题