2013-03-23 71 views
6

我問另外一個問題,這是一個直接的答案有點太複雜了,所以我煮下來到這個基本問題......cython - distutils vs cmake:與libpython鏈接?

當我建立使用標準用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到。所以鏈接命令:

$ 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安裝(系統或我項目的virtualenv)都能正常工作。然而,當我嘗試使用除鏈接系統python之外的任何東西導入它時,cmake與版本不匹配崩潰。

distutils模塊爲什麼沒有被鏈接工作正常?如果是這樣的話,爲什麼我需要使用鏈接libpython的cmake構建,以及如何避免它,以便它可以與我的任何python2.7解釋器一起工作而不會崩潰?

目前我可以用正確的蟒蛇直接的cmake:CXX=g++ cmake -DPYTHON_LIBRARY=/path/to/another/Python

+0

顯然,沒有直接鏈接到Python二進制文件的人可以工作,因爲動態鏈接器使用當前運行的Python連接符號(推測是好事)。不能說爲什麼cmake雖然拉動Python二進制文件;我從來沒有真正使用過cmake。 – torek 2013-03-23 09:55:03

+0

準確地說,我想到了什麼,以及我想要的是哪種行爲。 cmake事情發生在發現python並添加它的模塊的某處。我只是想找到一個解決方案,以便不能鏈接到python: - / – jdi 2013-03-23 10:04:38

回答

5

我意識到了問題的根源是相關cython-cmake-example以及如何其UseCython.cmakecython_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。