6

私は別の質問をしましたが、それは少し複雑すぎて簡単に答えることができなかったので、この基本的な質問に要約しました...

標準の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 インストール (システム、または私のプロジェクトの virtualenv) のいずれでも問題なく動作するようです。一方、リンクされたシステムpython以外でインポートしようとすると、バージョンの不一致でcmakeがクラッシュします。

distutils モジュールがリンクされていなくても正常に動作するのはなぜですか? その場合、cmake ビルドで libpython をリンクする必要があるのはなぜですか? その場合、どの python2.7 インタープリターでもクラッシュせずに動作するようにするにはどうすればよいでしょうか?

現在、次のコマンドを使用して、適切な python に cmake を向けることができます。CXX=g++ cmake -DPYTHON_LIBRARY=/path/to/another/Python

4

1 に答える 1

5

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 に対してリンクしません。

于 2013-03-23T19:55:58.410 に答える