2013-03-03 26 views
8

Tôi đang cố gắng xây dựng các ràng buộc python cho một thư viện mà tôi đã viết, và tôi đang gặp một số vấn đề khi nhận được cmake để hiểu rằng nó nên sử dụng boost-python thư viện cho python 3.liên kết cmake với libboost_python-py32.so thay vì libboost_python.so

Đây là tập tin cmake tôi:

cmake_minimum_required(VERSION 2.8) 

FIND_PACKAGE(Boost COMPONENTS 
       system 
       thread 
       python REQUIRED) 
find_package(PythonLibs REQUIRED) 

INCLUDE_DIRECTORIES(${PYTHON_LIBRARIES}) 
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS}) 
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) 

ADD_LIBRARY(
    pschulze SHARED 
    src/candidate_relation.cpp 
    src/schulze.cpp 
    src/calculate.cpp 
    src/candidate.cpp 
    src/ranking.cpp 
    src/userinput.cpp 
    python.cpp) 

TARGET_LINK_LIBRARIES(pschulze ${Boost_LIBRARIES} ${PYTHON_LIBRARIES}) 

ADD_EXECUTABLE(
    schulze 
    src/candidate_relation.cpp 
    src/schulze.cpp 
    src/calculate.cpp 
    src/candidate.cpp 
    src/ranking.cpp 
    src/userinput.cpp 
    src/json-spirit/json_spirit_reader.cpp 
    src/json-spirit/json_spirit_value.cpp 
    main.cpp) 

TARGET_LINK_LIBRARIES(schulze ${Boost_LIBRARIES} ${PYTHON_LIBRARIES}) 

ADD_DEFINITIONS(-std=gnu++0x -Os) 

add_subdirectory (tests) 

set(CMAKE_BUILD_TYPE Debug) 

Và đây là lỗi mối liên kết mà tôi nhận được:

Linking CXX executable schulze 
CMakeFiles/schulze.dir/src/schulze.cpp.o: In function `arg_to_python': 
/usr/include/boost/python/converter/builtin_converters.hpp:122: undefined reference to `PyInt_FromLong' 
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libboost_python.so: undefined reference to `PyString_Size' 
+0

Thay đổi thành 'find_package (PythonLibs 3 REQUIRED)' có hoạt động không? Bạn có lẽ nên xóa CMakeCache.txt của bạn trước khi thử. – Fraser

+0

các builtin_converters.hpp: 122 lỗi biến mất, nhưng libboost_python.so: undefined tham chiếu đến 'PyString_Size 'vẫn còn đó. –

+0

@Fraser: 'find_package (PythonLibs 3 REQUIRED)' sẽ không giúp bạn tìm thư viện Boost.Python tương ứng. Nó chỉ tìm các thư viện ngôn ngữ "cơ bản" của Python. –

Trả lời

5

Điều này có thể làm các trick:

set(Python_ADDITIONAL_VERSIONS 3.2) 

find_package(Boost COMPONENTS system thread python-py32 REQUIRED) 
+1

Điều này có thể hoạt động, ví dụ: trên Ubuntu. Nhưng nếu bạn biên dịch Boost từ các nguồn trên Mac, thư viện được gọi đơn giản là 'libboost_python3'. Có thể xảy ra trên các bản phân phối Linux khác (ví dụ: Fedora). –

+0

@ user465139 bạn sẽ đặt ở đâu? – blanche

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