【问题标题】:Undefined symbols: "boost::system::generic_category()" Cmake and boost setup未定义的符号:“boost::system::generic_category()” Cmake 和 boost 设置
【发布时间】:2011-03-26 19:11:36
【问题描述】:

让我快速解决问题。我有一个依赖于 boost 的库“serial”,它是在 cmake 中设置的,我安装了一个 Findserial.cmake 来帮助我的第二个库“xbow_400”找到它。这一切都很好,直到我尝试编译链接到“xbow_400”的“test_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

现在,我可以通过将这些行添加到“xbow_400”的 CMakeLists.txt 文件中来解决此问题:

+ # 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 使用串行,而不必专门查找 boost 并链接到它。 (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 上尝试过。

【问题讨论】:

    标签: macos boost cmake


    【解决方案1】:

    假设我正确理解了您的问题,那么不,这是不可能的。如果您的程序使用库 A 而库使用库 B,那么您必须将您的程序与库 B 链接。如果库 B 使用库 C,那么您也必须链接到库 C。这可以永远持续下去。

    有时链接器可以判断您是否没有使用符号,但有时却不能。例如:如果库 A 包含全局符号 a 和 b 以及带有 GNU 链接器的静态符号 c,如果您在程序中使用符号 a 而不是符号 b 或 c。链接器将插入符号 b 但不会插入符号 c,即使这两个符号都未使用。这里的规则很复杂并且特定于平台。要让链接器不链接 boost::system 您必须弄清楚是什么规则导致链接器需要该符号并更改您的代码以删除依赖关系。在大多数情况下,除非链接器发疯并将 20 MB 不需要的符号带入您的程序,否则可能不值得付出努力。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 2021-05-16
      • 2013-08-14
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多