2011-03-26 53 views
3

让我快速设置问题。我有一个依赖于boost的库“序列”,它是在cmake中设置的,我有一个Findserial.cmake被安装来帮助我的第二个库“xbow_400”找到它。这是所有罚款,直到我试图编译“test_xbow_400”链接到“xbow_400”,在这一点上,我得到这个连接错误:现在未定义的符号:“boost :: system :: generic_category()”Cmake和boost setup

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解决这个问题。对于“xbow_400” 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使用串口,​​而不必专门为寻找刺激,并链接到它。 (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上尝试过。

回答

2

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

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

相关问题