2013-03-23 12 views
6

ben bu temel soruya aşağı haşlanmış böylece düz bir cevap için biraz fazla karışıktı başka bir soru ...cython - cmake vs distutils: libpython karşı bağlantı? Ben standart Cython distutils kullanarak benim <code>aModule.so</code> oluştururken

sormuştu, olması görünmüyor

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

Ama cmake kurulum ile oluştururken, bu .bu içine libpython bağlayan bir bağlayıcı komutu üreten tutar: libpython karşı bağlanmış

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

Dağıtımcılar tarafından üretilen modül benim python2.7 kurulumumdan herhangi biriyle (sistemim veya projem için bir virtualenv) iyi çalışıyor gibi görünüyor. Oysa cmake, bir sürümle bağlantılı bir sistem pythonunu denediğimde ve ithal ettiğimde, sürüm uyuşmazlığı ile çöküyor.

Neden distors modülü bağlı olmadan düzgün çalışıyor? Ve eğer durum buysa, neden libpython'u bağlayan cmake yapısına sahip olmalıyım, ve eğer böyle bir durumda, python2.7 tercümanımın herhangi biriyle çarpışma olmadan çalışacak şekilde nasıl önleyebilirim?

Şu anda doğru piton de cmake yönlendirebilir: CXX=g++ cmake -DPYTHON_LIBRARY=/path/to/another/Python

+0

Açıkçası, bir Python ikili çalışmasına doğrudan bağlı olmayan biri, çünkü dinamik bağlayıcı, geçerli çalışan Python'la (muhtemelen iyi bir şey) semboller arasında kancalar. Cmake'nin neden Python binary'sinde çekiyor olduğunu söyleyemem; Kendimi asla cmake kullanmamıştım. – torek

+0

Tam olarak ne düşündüğümü ve hangi davranışı istediğimi. Cmake şey python bulur ve onu ekler modülünden bir yerde oluyor. Sadece python ile bağlantı kuramayacak bir çözüm bulmak istiyorum: - / – jdi

cevap

5

Ben cython-cmake-example ve nasıl onun UseCython.cmakecython_add_module() fonksiyon libpython karşı kütüphane bağlantı açıkça ediyorum ilgiliydi sorunun kaynağını fark etti.

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

Şimdi arayabilirsiniz: Bu tamamen taşınabilir bir çözüm olup olmadığını bilmiyorum çünkü benim kendi kullanımı için yapıyor sona ne

, DYNAMIC_LOOKUP söylemek o işleve bir bayrak eklemek oldu cython_add_module ve libpython'a karşı bağlantı oluşturmaz.