【问题标题】:Swig -outdir option doesn't include the .so fileSwig -outdir 选项不包含 .so 文件
【发布时间】: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_OUTDIRPYTHON_PATH 环境变量中,我就无法在 Python 中加载模块。所以要解决这个问题,我可以:

  1. PROJECT_BINARY_DIR 目录添加到PYTHON_PATH
  2. 将 .so 文件复制到 CMAKE_SWIG_OUTDIR 或使用 CMake 系统创建符号链接。
  3. 不要设置CMAKE_SWIG_OUTDIR 变量,以便在PROJECT_BINARY_DIR 中创建所有内容,并且仅将此位置添加到PYTHON_PATH

但这些似乎都不符合逻辑,因为CMAKE_SWIG_OUTDIR 应该用于输出 .py 和 .so 文件。我在这里遗漏了什么吗?

【问题讨论】:

    标签: python cmake swig


    【解决方案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})
    ...
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多