2013-03-23 29 views
6

Tôi đã hỏi một câu hỏi khác hơi quá phức tạp cho một câu trả lời thẳng nên tôi đã đun sôi nó xuống câu hỏi cơ bản này ...cython - distutils vs cmake: liên kết với libpython?

Khi tôi xây dựng aModule.so bằng cách sử dụng một rãnh chuẩn chuẩn, nó dường như không liên kết chống lại 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) 

Nhưng khi tôi xây dựng với một thiết lập cmake, nó giữ sản xuất một lệnh mối liên kết liên kết libpython vào .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) 

Mô-đun được tạo ra bởi các rãnh có vẻ hoạt động tốt với bất kỳ cài đặt python2.7 nào của tôi (hệ thống hoặc virtualenv cho dự án của tôi). Trong khi các cmake tai nạn với một phiên bản không phù hợp khi tôi cố gắng và nhập khẩu nó với bất cứ điều gì nhưng python hệ thống liên kết.

Tại sao mô-đun phân phối hoạt động tốt mà không bị liên kết? Và nếu đó là trường hợp, tại sao tôi cần phải có cmake xây dựng liên kết libpython, và làm thế nào tôi có thể ngăn chặn nó nếu thats trường hợp để nó hoạt động với bất kỳ thông dịch viên python2.7 của tôi mà không có một vụ tai nạn?

Hiện nay tôi có thể hướng cmake tại python đúng với: CXX=g++ cmake -DPYTHON_LIBRARY=/path/to/another/Python

+0

Rõ ràng là người không liên kết trực tiếp với một nhị phân Python hoạt động vì liên kết động móc lên các ký hiệu với Python đang chạy hiện tại (có lẽ là một điều tốt). Không thể nói lý do tại sao cmake là kéo trong Python nhị phân mặc dù; Tôi đã không bao giờ thực sự sử dụng cmake bản thân mình. – torek

+0

Chính xác những gì tôi đã tìm và đó là hành vi tôi muốn. Điều cmake đang xảy ra ở đâu đó từ mô-đun tìm thấy python và thêm nó. Tôi chỉ muốn tìm một giải pháp để có thể không liên kết với python: - / – jdi

Trả lời

5

tôi nhận ra nguồn gốc của vấn đề này có liên quan đến các cython-cmake-example và làm thế nào UseCython.cmakecython_add_module() chức năng của nó sẽ liên kết một cách rõ ràng thư viện chống libpython.

Những gì tôi đã kết thúc làm cho việc sử dụng của riêng tôi, vì tôi không biết nếu điều này là một giải pháp hoàn toàn di động, là thêm một lá cờ để chức năng đó để nói 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() 

Bây giờ tôi có thể gọi cython_add_module và nó sẽ không liên kết với libpython.

Các vấn đề liên quan