2011-03-26 6 views
3

문제를 신속하게 설정하겠습니다. 나는 부스트에 의존하는 라이브러리 "serial"을 가지고 있으며 cmake에서 설정되어 있고 두 번째 라이브러리 "xbow_400"이 도움이되도록 설치된 Findserial.cmake를 가지고 있습니다.정의되지 않은 기호 : "boost :: system :: generic_category()"Cmake and 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"에 연결 "test_xbow_400"를 컴파일 할 때까지 모든 괜찮습니다. TXT는 "xbow_400"에 대한 파일 :

+ # 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 코드는 직렬 라이브러리를 통해서만 직접 부스트를 포함하거나 사용하지 않습니다.)

이것이 가능합니까? 그렇다면 필자는 Findserial.cmake에 추가해야합니까, 아니면 제가 시리얼을 만드는 방식을 바꿔야합니까?

시리얼 라이브러리 : https://github.com/wjwwood/serial xbow_400 : 나는 OS X 10.6.6 오전 https://github.com/wjwwood/Crossbow-IMU400CC-100

. 나는 Linux 나 Windows에서 아직 이것을 시도하지 않았다.

답변

2

귀하의 문제를 올바르게 이해한다고 가정하면 이럴 수 없습니다. 프로그램이 라이브러리 A를 사용하고 라이브러리가 라이브러리 B를 사용하는 경우 프로그램을 라이브러리 B에 링크해야합니다. 라이브러리 B가 라이브러리 C를 사용하면 라이브러리 C 와도 링크해야합니다. 이것은 영원히 계속 될 수 있습니다.

심볼을 사용하지 않고 링컨이 사용할 수없는 경우 링커에서 알 수있는 경우가 있습니다. 예를 들어, 프로그램에서 기호 a를 사용하지만 기호 b 또는 기호 c를 사용하지 않는 경우 라이브러리 A에 전역 기호 a 및 b가 있고 정적 기호 c가 GNU 링커와 함께 있으면. 링커는 기호 b를 삽입하지만 기호 c는 사용하지 않습니다. 여기에있는 규칙은 복잡하고 플랫폼에 따라 다릅니다. 링커가 boost :: system을 연결하지 못하게하려면 어떤 규칙으로 인해 링커가 심볼을 필요로하는지 파악해야하고 의존성을 제거하는 코드를 변경해야합니다. 대부분의 경우 링커가 미쳐서 20 MB의 불필요한 기호를 프로그램에 넣지 않는 한 그럴만 한 가치가 없습니다.

관련 문제