【发布时间】:2014-08-18 07:34:00
【问题描述】:
我有一个小项目,我使用 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 不在CMAKE_SWIG_OUTDIR 指定的位置创建?在该目录中仅创建 .py 文件。这是 CMake UseSWIG.cmake 文件的错误吗? .so 文件仍在PROJECT_BINARY_DIR 位置。因此,如果只有位置 CMAKE_SWIG_OUTDIR 在 PYTHON_PATH 环境变量中,我就无法在 Python 中加载模块。所以要解决这个问题,我可以:
- 将
PROJECT_BINARY_DIR目录添加到PYTHON_PATH。 - 将 .so 文件复制到
CMAKE_SWIG_OUTDIR或使用 CMake 系统创建符号链接。 - 不要设置
CMAKE_SWIG_OUTDIR变量,以便在PROJECT_BINARY_DIR中创建所有内容,并且仅将此位置添加到PYTHON_PATH。
但这些似乎都不符合逻辑,因为CMAKE_SWIG_OUTDIR 应该用于输出 .py 和 .so 文件。我在这里遗漏了什么吗?
【问题讨论】: