Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 未定义的符号:";boost::system::generic_category();Cmake和boost设置_Macos_Boost_Cmake - Fatal编程技术网

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

Macos 未定义的符号:";boost::system::generic_category();Cmake和boost设置,macos,boost,cmake,Macos,Boost,Cmake,让我很快解决这个问题。我有一个依赖于boost的库“serial”,它是在cmake中设置的,我有一个Findserial.cmake,可以安装它来帮助我的第二个库“xbow_400”找到它。在我尝试编译链接到“xbow_400”的“test_xbow_400”之前,这一切都是正常的,在这一点上,我得到了以下链接错误: Undefined symbols: "boost::system::generic_category()", referenced from: __static

让我很快解决这个问题。我有一个依赖于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文件中来解决此问题:

但是,我想让xbow_400使用串行,而不必特别查找boost和链接到它。(xbow_400代码不包括或直接使用boost,仅通过串行库)

这可能吗?如果是这样的话,我应该向Findserial.cmake添加一些东西,还是应该改变构建序列的方式

序列库: xbow_400:


我使用的是OSX10.6.6。我还没有在Linux或Windows上尝试过此操作。

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

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

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