2013-03-23 14 views
6

私は標準cythonののdistutilsを使用して、私のaModule.soを構築するとき、していないようです...cython - distutils vs cmake:libpythonとリンクしていますか?

を私は、この基本的な質問にそれを煮詰めてストレートな答えのために少しあまりにも複雑だった別の質問をしていました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の設定でビルドするとき、それが.soのに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)でうまく動作しているようです。私が何かとそれをインポートしようとすると、cmakeはバージョンの不一致でクラッシュしますが、リンクされたシステムのPythonはそれとは異なります。

なぜdistutilsモジュールはリンクされずに正常に動作しますか?それが事実なら、なぜlibakethonをリンクするcmakeビルドを作成する必要がありますか?クラッシュなしでPython2.7インタプリタで動作するようにするには、どうすればそれを防ぐことができますか?

現在、私は右のpythonでcmakeのを指示することができます:CXX=g++ cmake -DPYTHON_LIBRARY=/path/to/another/Python

+0

明らかに、Pythonバイナリに直接リンクされていないものは、ダイナミックリンカがシンボルを現在動作しているPython(おそらく良いこと)と結びつけるため動作します。なぜcmakeがPythonバイナリを引っ張っているのかは分かりません。私はcmakeを自分で使ったことは一度もありません。 – torek

+0

まさに私が考えたことと、私が望むふるまいです。 cmakeのことは、Pythonを見つけて追加するモジュールのどこかで起こっています。私はちょうどPythonとリンクできないようにするための解決策を見つけたい: - / – jdi

答えて

5

私はcython-cmake-exampleに関連してどのようにそのUseCython.cmakecython_add_module()機能は明示的にlibpythonに対してライブラリをリンクするた問題の原因を実現。私が呼び出すことができる

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() 

:これは完全にポータブルソリューションであれば、私にはわからないため、DYNAMIC_LOOKUPを言って、その関数にフラグを追加することでした私は私自身の使用のためにやってしまった、

cython_add_moduleであり、libpythonとはリンクしません。

関連する問題