加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:44:10 所属栏目:Python 来源:网络整理
导读:我有一个小项目,我使用CMake系统从C文件创建一个 Python模块.在CMakeLists.txt文件中,我将Swig集成如下: # only the Swig part herefind_package(SWIG REQUIRED)include(${SWIG_USE_FILE})find_package(PythonLibs)include_directories(${PYTHON_INCLUDE_PA
我有一个小项目,我使用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中加载模块.所以为了解决这个问题,我可以:

>将PROJECT_BINARY_DIR目录添加到PYTHON_PATH.
>将.so文件复制到CMAKE_SWIG_OUTDIR或使用CMake系统创建符号链接.
>不要设置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})
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读