2011-05-01 20 views
5

ho un main.cpp in questo modo:Boost.Python e CMake collegare e caricare errori

#include <boost/python.hpp> 

const char* greeting() 
{ 
    return "Hello world?"; 
} 

BOOST_PYTHON_MODULE(test) 
{ 
    using namespace boost::python; 

    def("greeting", greeting); 
} 

E un file CMakeLists.txt:

project(test) 
cmake_minimum_required(VERSION 2.8) 

# get boost 
set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON) 
find_package(Boost COMPONENTS 
       system 
       thread 
       python 
      REQUIRED) 
include_directories(${Boost_INCLUDE_DIRS}) 
link_directories(${Boost_LIBRARY_DIRS}) 

# get python 
find_package(PythonLibs REQUIRED) 
include_directories(${PYTHON_INCLUDE_DIRS}) 
link_directories(${PYTHON_LIBRARIES}) 

add_library(test SHARED 
     main.cpp 
    ) 

posso correre cmake e make bene. Emette un bel file libtest.so per me. Per provarlo, ho uno script Python in questo modo:

import libtest 

print(libtest.greeting()) 

L'esecuzione di questo nella stessa directory libtest.so dà il seguente errore:

Traceback (most recent call last): 
    File "test.py", line 1, in <module> 
    import libtest 
ImportError: /home/travis/projects/boost-python-test/build/libtest.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv 

Yikes! Il problema è piuttosto chiaro con make VERBOSE=1 ... la linea creando miei libtest.so si presenta così:

/usr/bin/c++ -fPIC -shared -Wl,-soname,libtest.so -o libtest.so CMakeFiles/test.dir/main.cpp.o -L/usr/lib/libpython2.7.so 

Sto avendo un blocco mentale sul motivo per cui non vedo un -L/usr/lib/libboost_python-mt-py27.a su quella linea. Ha funzionato chiaramente per find_package(PythonLibs ...). Sto cadendo a causa di un po 'di novità di CMake.

risposta

8

La soluzione a questo è abbastanza semplice. Si deve collegare esplicitamente le librerie con target_link_librariesdopo l'istruzione add_library.

target_link_libraries(test 
     ${Boost_LIBRARIES} 
     ${PYTHON_LIBRARIES} 
    ) 

Non sono ancora sicuro del motivo per cui ha funzionato per Python senza. Magia?

+0

grazie per aver pubblicato la risposta dopo averla trovata da te, che ha risolto il mio problema. –