2017-09-15 6 views
0

J'utilise Boost::Python et Boost::Asio écrire mes sources et ensuite écrire CMakeLists.txt pour créer ma propre bibliothèque partagée à partir de sources comme ça (une partie du fichier):CMake problèmes reliant Boost

`find_package(Boost REQUIRED COMPONENTS python system thread regex) 
if (Boost_FOUND) 
    set(Boost_USE_STATIC_LIBS  OFF) 
    set(Boost_USE_MULTITHREADED ON) 
    include_directories(${Boost_INCLUDE_DIRS}) 
    link_directories(${Boost_LIBRARY_DIRS}) 
endif() 
find_package(PythonLibs 3 REQUIRED) 
find_package(PythonInterp 3 REQUIRED) 
if (PYTHONLIBS_FOUND) 
    include_directories(${PYTHON_INCLUDE_DIRS}) 
    link_directories(${PYTHON_LIBRARIES}) 
endif() 
add_library(my_lib SHARED ${MY_SOURCES}) 
set_target_properties(my_lib PROPERTIES PREFIX "" SUFFIX ".pyd") 
target_link_libraries(my_lib ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})` 

(Comme Boost::Asio est-tête bibliothèque seulement-j'ai ajouté juste system thread regex depuis que j'ai découvert que cela dépend). Ainsi, les résultats CMake semblent corrects:

-- Boost version: 1.65.0 -- Found the following Boost libraries: -- python -- system -- thread -- regex -- chrono -- date_time -- atomic -- Configuring done -- Generating done

(Mais pourquoi est-il à la recherche de Chronos etc. Dépendances supplémentaires?) Eh bien, quand je suis en make my_lib, il y a des erreurs de l'éditeur de liens comme: In function PyInit_my_lib: undefined reference to boost::python::detail::init_module(PyModuleDef&, void (*)()) et In function boost::asio::detail::posix_thread::~posix_thread(): /usr/local/include/boost/asio/detail/impl/posix_thread.ipp:35: undefined reference to pthread_detach , donc Boost n'était pas correctement lié. J'ai lu beaucoup de documents et de questions similaires, mais je ne pouvais pas comprendre ce que je fais mal.

P.S. Lorsque j'ai désactivé l'option de l'éditeur de liens -Wl,--no-undefined, la liaison a réussi, mais les références non définies sont toujours présentes et je ne peux pas importer de module à l'aide de python.

+0

Vous devez d'abord régler set (Boost_USE_STATIC_LIBS OFF) (Boost_USE_MULTITHREADED ON) 'avant votre appel find_package. Ensuite, vous devez changer l'ordre des bibliothèques dans votre appel target_link_libraries: les bibliothèques Phython vont d'abord, puis les bibliothèques Boost. – vre

+0

@vre fait, mais n'a pas aidé :( – Uroboros

+0

Avez-vous supprimé le 'CMakeCache.txt' après l'application des changements? Parfois, il est nécessaire, sinon vos modifications ne seront pas applicables – vre

Répondre

0

Enfin, la solution a été trouvée par moi-même. Le problème était en effet Boost::Python n'a pas été construit correctement. Je ne sais pas complètement si c'était un bug ou ma propre faute, mais dans mon cas, éditer Boost Build's user-config.jam pour utiliser python3.5 n'était pas suffisant: le script de génération en cours d'exécution a abouti à libboost_python3.so, mais en interne, l'interpréteur python2.7 a été utilisé par raisons inconnues à moi. Donc, ce que j'ai fait est lancé Boost initial bootstrapping comme ./bootstrap.sh --with-python=/usr/bin/python3.5m, c'est-à-dire pointé le chemin absolu vers l'interprète requis. Après la reconstruction Boost::Python, tous les symboles ont été résolus avec succès.