2011-05-01 11 views
5

que tienen un main.cpp así:Boost.Python y CMake Enlace y la carga Errores

#include <boost/python.hpp> 

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

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

    def("greeting", greeting); 
} 

Y un archivo 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 
    ) 

puedo correr cmake y make bien. Muestra un pequeño archivo libtest.so para mí. Para probarlo, tengo un script en Python, así:

import libtest 

print(libtest.greeting()) 

La ejecución de este en el mismo directorio que libtest.so da el siguiente error:

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 

Huy! El problema es bastante claro con make VERBOSE=1 ... la línea de creación de mis libtest.so se ve así:

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

estoy teniendo un bloqueo mental de por qué no veo un -L/usr/lib/libboost_python-mt-py27.a en esa línea. Claramente funcionó para find_package(PythonLibs ...). Me estoy quedando corto debido a algunos newbishness CMake.

Respuesta

8

La solución a esto es bastante simple. Uno tiene que vincular explícitamente las bibliotecas con target_link_librariesdespués de la declaración add_library.

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

Todavía no estoy seguro de por qué funcionó para Python sin eso. ¿Magia?

+0

gracias por publicar la respuesta después de que la encontrases tú mismo, lo que resolvió mi problema. –