2017-09-15 13 views
0

Ich verwende Boost::Python und Boost::Asio meine Quellen und nächste write CMakeLists.txt meine eigene gemeinsame Bibliothek von Quellen wie das (ein Teil der Datei) zu erstellen:CMake Boost-Verknüpfung Probleme

`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})` 

(Wie Boost::Asio ist Header - Nur Bibliothek Ich habe nur system thread regex hinzugefügt, seit ich herausgefunden habe, hängt davon ab). So sehen CMake Ergebnisse richtig:

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

(Aber warum sucht es für chrono etc. Zusätzliche Abhängigkeiten?) Nun, als ich make my_lib renne, gibt es einige Linker Fehler wie: In function PyInit_my_lib: undefined reference to boost::python::detail::init_module(PyModuleDef&, void (*)()) und 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 , Boost wurde also nicht richtig verknüpft. Ich habe viele Dokumente und ähnliche Fragen gelesen, konnte aber nicht verstehen, was ich falsch mache.

P.S. Wenn ich die Linkeroption -Wl,--no-undefined deaktivierte, war die Verknüpfung erfolgreich, aber undefinierte Referenzen sind immer noch da und ich kann das Modul nicht mit Python importieren.

+0

Zuerst müssen Sie 'set (Boost_USE_STATIC_LIBS OFF) setzen (Boost_USE_MULTITHREADED ON)' vor Ihrem Aufruf find_package setzen. Und zweitens sollten Sie die Reihenfolge der Bibliotheken in Ihrem target_link_libraries-Aufruf ändern: Phython-Bibliotheken gehen zuerst, dann Boost-Bibliotheken. – vre

+0

@vre getan, aber hat nicht geholfen :( – Uroboros

+0

Haben Sie die 'CMakeCache.txt' nach dem Anwenden der Änderungen gelöscht? Manchmal ist es notwendig, sonst werden Ihre Änderungen nicht gelten. – vre

Antwort

0

Schließlich wurde die Lösung von mir gefunden. Das Problem war in der Tat Boost::Python wurde nicht richtig gebaut. Ich weiß nicht vollständig, ob es ein Fehler oder meine eigene Schuld war, aber in meinem Fall war das Bearbeiten Boost Build's user-config.jam für die Verwendung von Python3.5 nicht genug: ausgeführt Build-Skript führte zu libboost_python3.so, aber intern Python2.7 Interpreter wurde für verwendet Gründe, die mir unbekannt sind.

Also, was ich getan habe, ist Boost initialen Bootstrapping als ./bootstrap.sh --with-python=/usr/bin/python3.5m gestartet, d. H. Wies den absoluten Pfad zum erforderlichen Interpreter. Nach dem Neuaufbau Boost::Python wurden alle Symbole erfolgreich aufgelöst.