Неопределенные символы: «boost :: system :: generic_category ()» Настройка Cmake и Boost - PullRequest
3 голосов
/ 26 марта 2011

Позвольте мне быстро решить проблему. У меня есть библиотека "serial", которая зависит от boost, и она настроена в cmake, и у меня есть Findserial.cmake, который устанавливается, чтобы помочь моей второй библиотеке "xbow_400" найти ее. Это все нормально, пока я не попытаюсь скомпилировать «test_xbow_400», который ссылается на «xbow_400», и в этот момент я получаю эту ошибку связывания:

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

Теперь я могу решить эту проблему, добавив эти строки в мой файл CMakeLists.txt для "xbow_400":

+ # 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})

НО, я бы хотел, чтобы xbow_400 использовал серийный БЕЗ необходимости специально искать буст и ссылку на него. (Код xbow_400 не включает и не использует boost напрямую, только через последовательную библиотеку).

Возможно ли это? И если да, я должен добавить что-то в Findserial.cmake или я должен изменить способ создания серийного?

Серийная библиотека: https://github.com/wjwwood/serial xbow_400: https://github.com/wjwwood/Crossbow-IMU400CC-100

Я на OS X 10.6.6. Я еще не пробовал это на Linux или Windows.

1 Ответ

2 голосов
/ 27 марта 2011

Если я правильно понимаю вашу проблему, то нет, это невозможно. Если ваша программа использует библиотеку A, а библиотека использует библиотеку B, то вы должны связать свою программу с библиотекой B. Если библиотека B использует библиотеку C, то вы должны также связать ее с библиотекой C. Это может продолжаться вечно.

Иногда компоновщик может определить, не используете ли вы символ, а иногда нет. Например: если библиотека A содержит глобальные символы a и b и статический символ c с компоновщиком GNU, если вы используете в своей программе символ a, но не символ b или c. Компоновщик вставит символ b, но не символ c, даже если оба эти символа не используются. Правила здесь сложны и зависят от платформы. Чтобы компоновщик не связывал boost :: system, вам нужно выяснить, по какому правилу компоновщик хочет этот символ и изменить свой код для удаления зависимости. В большинстве случаев это, вероятно, не стоит усилий, если компоновщик не сходит с ума и не добавляет в вашу программу 20 МБ ненужных символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...