首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义的符号:"boost::system::generic_category()“Cmake和boost设置

未定义的符号:"boost::system::generic_category()“Cmake和boost设置
EN

Stack Overflow用户
提问于 2011-03-27 03:11:36
回答 1查看 4.4K关注 0票数 3

让我快速解决这个问题。我有一个依赖于boost的库“序列”,它是在cmake中设置的,我还安装了一个Findserial.cmake来帮助我的第二个库"xbow_400“找到它。这一切都很好,直到我尝试编译链接到"xbow_400“的"test_xbow_400”,在这一点上我得到这个链接错误:

代码语言:javascript
复制
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文件中添加以下行来解决这个问题:

代码语言:javascript
复制
+ # 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上尝试过。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-27 08:04:06

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5444633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档