3 Stimmen

Undefinierte Symbole: "boost::system::generic_category()" Cmake und boost Setup

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.

2voto

ltc Punkte 3193

Wenn ich Ihr Problem richtig verstehe, dann ist das nicht möglich. Wenn Ihr Programm die Bibliothek A verwendet und die Bibliothek B, dann müssen Sie Ihr Programm gegen die Bibliothek B linken. Wenn die Bibliothek B die Bibliothek C verwendet, dann müssen Sie auch gegen die Bibliothek C linken. Das kann ewig so weitergehen.

In manchen Fällen kann der Linker erkennen, ob Sie ein Symbol nicht verwenden, in anderen Fällen nicht. Beispiel: Bibliothek A enthält die globalen Symbole a und b und das statische Symbol c. Wenn Sie das Symbol a in Ihrem Programm verwenden, aber nicht das Symbol b oder c, fügt der Linker das Symbol b ein, aber nicht das Symbol c, obwohl beide Symbole unbenutzt sind. Die Regeln hier sind kompliziert und plattformspezifisch. Um den Linker dazu zu bringen, boost::system nicht zu linken, müssten Sie herausfinden, welche Regel den Linker dazu veranlasst, dieses Symbol zu wollen, und Ihren Code ändern, um die Abhängigkeit zu entfernen. In den meisten Fällen lohnt sich der Aufwand wahrscheinlich nicht, es sei denn, der Linker spielt verrückt und bringt 20 MB nicht benötigter Symbole in Ihr Programm.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X