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.
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
@vre getan, aber hat nicht geholfen :( – Uroboros
Haben Sie die 'CMakeCache.txt' nach dem Anwenden der Änderungen gelöscht? Manchmal ist es notwendig, sonst werden Ihre Änderungen nicht gelten. – vre