gpt4 book ai didi

macos - undefined symbol : "boost::system::generic_category()" Cmake and boost setup

转载 作者:行者123 更新时间:2023-12-01 15:00:07 24 4
gpt4 key购买 nike

让我快速解决问题。我有一个依赖于 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 使用 serial 而不必专门寻找 boost 并链接到它。 (xbow_400 代码不包含或直接使用 boost,仅通过串行库)。

这可能吗?如果是这样,我应该向 Findserial.cmake 添加内容还是应该更改构建序列的方式?

序列库:https://github.com/wjwwood/serialxbow_400:https://github.com/wjwwood/Crossbow-IMU400CC-100

我使用的是 OS X 10.6.6。我还没有在 Linux 或 Windows 上尝试过。

最佳答案

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

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

关于macos - undefined symbol : "boost::system::generic_category()" Cmake and boost setup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5444633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com