我问了另一个问题,这个问题太复杂了,无法直接回答,所以我把它归结为这个基本问题…
当我使用标准的cython distutils构建aModule.so
时,它似乎没有与libpython
链接:
$ otool -L aModule.so
aModule.so:
/usr/local/lib/libboost_thread-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/local/opt/thrift/lib/libthrift-0.9.0.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)
但是当我用cmake设置构建时,它不断产生一个链接器命令,将libpython
链接到.so:
$ otool -L aModule.so
aModule.so:
/System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.1)
/usr/local/opt/thrift/lib/libthrift-0.9.0.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/local/lib/libboost_thread-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
由distutils生成的模块似乎可以很好地与我的任何python2.7安装(系统或我的项目的虚拟环境)一起工作。然而,当我尝试使用除链接系统python之外的任何内容导入cmake时,它会因版本不匹配而崩溃。
为什么distutils模块工作良好没有被链接?如果是这种情况,为什么我需要有cmake构建链接libpython,如果是这种情况,我该如何防止它,以便它与我的任何python2.7解释器一起工作而不会崩溃?
目前我可以直接cmake在正确的python: CXX=g++ cmake -DPYTHON_LIBRARY=/path/to/another/Python
我意识到问题的根源与cython-cmake-example
以及它的UseCython.cmake
cython_add_module()
函数如何显式地将库链接到libpython有关。
我最终为自己的使用做了什么,因为我不知道这是否是一个完全可移植的解决方案,是在该函数中添加一个标志,说DYNAMIC_LOOKUP
:
function( cython_add_module _name _dynamic_lookup )
set( pyx_module_sources "" )
set( other_module_sources "" )
foreach( _file ${ARGN} )
if( ${_file} MATCHES ".*\.py[x]?$" )
list( APPEND pyx_module_sources ${_file} )
else()
list( APPEND other_module_sources ${_file} )
endif()
endforeach()
compile_pyx( ${_name} generated_file ${pyx_module_sources} )
include_directories( ${PYTHON_INCLUDE_DIRS} )
python_add_module( ${_name} ${generated_file} ${other_module_sources} )
### Added here ##
if( ${_dynamic_lookup} )
message( STATUS "Not linking target ${_name} against libpython" )
set_target_properties( ${_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
else()
target_link_libraries( ${_name} ${PYTHON_LIBRARIES} )
endif()
endfunction()
现在我可以调用cython_add_module
,它不会链接到libpython。