Lassen Sie mich das Problem ganz schnell lösen. Ich habe eine Bibliothek "serial", die von boost abhängt und in cmake eingerichtet ist, und ich habe eine Findserial.cmake, die installiert wird, damit meine zweite Bibliothek "xbow_400" sie findet. Das ist alles in Ordnung, bis ich versuche, "test_xbow_400" zu kompilieren, das auf "xbow_400" verlinkt, woraufhin ich diesen Verknüpfungsfehler erhalte:
Undefined symbols:
"boost::system::generic_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in test_xbow_400.o
__static_initialization_and_destruction_0(int, int)in test_xbow_400.o
__static_initialization_and_destruction_0(int, int)in libxbow_400.a(xbow_400.o)
__static_initialization_and_destruction_0(int, int)in libxbow_400.a(xbow_400.o)
__static_initialization_and_destruction_0(int, int)in libserial.a(serial.o)
__static_initialization_and_destruction_0(int, int)in libserial.a(serial.o)
"boost::system::system_category()", referenced from:
boost::asio::error::get_system_category() in test_xbow_400.o
__static_initialization_and_destruction_0(int, int)in test_xbow_400.o
boost::asio::error::get_system_category() in libxbow_400.a(xbow_400.o)
__static_initialization_and_destruction_0(int, int)in libxbow_400.a(xbow_400.o)
boost::asio::error::get_system_category() in libserial.a(serial.o)
boost::system::error_code::error_code()in libserial.a(serial.o)
__static_initialization_and_destruction_0(int, int)in libserial.a(serial.o)
ld: symbol(s) not found
Jetzt kann ich dieses Problem beheben, indem ich diese Zeilen in meine CMakeLists.txt-Datei für "xbow_400" einfüge:
+ # Find Boost
+ find_package(Boost COMPONENTS system filesystem thread REQUIRED)
+
+ link_directories(${Boost_LIBRARY_DIRS})
+ include_directories(${Boost_INCLUDE_DIRS})
# Compile the xbow_400 Library
add_library(xbow_400 src/xbow_400.cpp include/xbow_400.h)
- target_link_libraries(xbow_400 ${serial_LIBRARIES})
+ target_link_libraries(xbow_400 ${serial_LIBRARIES} ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_THREAD_LIBRARY})
ABER, ich möchte, dass xbow_400 serielle Daten verwendet, OHNE dass ich extra nach boost suchen muss und einen Link dazu erstellen muss. (Der xbow_400-Code enthält oder verwendet boost nicht direkt, sondern nur über die serielle Bibliothek).
Ist dies möglich? Und wenn ja, sollte ich Dinge zu Findserial.cmake hinzufügen oder sollte ich die Art und Weise ändern, wie ich seriell baue?
Serienbibliothek: https://github.com/wjwwood/serial xbow_400: https://github.com/wjwwood/Crossbow-IMU400CC-100
Ich arbeite mit OS X 10.6.6. Ich habe dies noch nicht unter Linux oder Windows ausprobiert.