gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:43 24 4
gpt4 key购买 nike

我有一个小项目,我在其中使用 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 系统创建符号链接(symbolic link)。
  3. 不要设置 CMAKE_SWIG_OUTDIR 变量,以便在 PROJECT_BINARY_DIR 中创建所有内容,并仅将此位置添加到 PYTHON_PATH

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

最佳答案

我不确定为什么 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})
...

关于python - Swig -outdir 选项不包含 .so 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25358312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com