2009-06-30 43 views
28

Tôi sử dụng một makefile tạo cmake để biên dịch một tệp C++ phụ thuộc vào thư viện hệ thống tệp tăng.Làm thế nào để liên kết với boost.system với cmake

Trong quá trình liên kết tôi nhận được lỗi sau:

 
Undefined symbols: 
    "boost::system::get_generic_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
    "boost::system::get_system_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make[2]: *** [src/ImageMarker] Error 1 

Hành động từ makefile mà tạo ra lỗi này là dòng này:

 
cd /Users/janusz/Documents/workspace/ImageMarker/Debug/src && /opt/local/bin/cmake -E cmake_link_script CMakeFiles/ImageMarker.dir/link.txt --verbose=1 
/usr/bin/c++ -O3 -Wall -Wno-deprecated -g -verbose -Wl,-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/ImageMarker.dir/ImageMarker.cpp.o CMakeFiles/ImageMarker.dir/Image.cpp.o CMakeFiles/ImageMarker.dir/utils.cpp.o CMakeFiles/ImageMarker.dir/XMLWriter.cpp.o CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o -o ImageMarker -L/opt/local/lib ../libTinyXml.a /opt/local/lib/libboost_filesystem-mt.dylib 

Một số googling cho tôi thấy rằng lỗi này có vẻ được phổ biến trên các máy mac với thư viện hệ thống tập tin tăng vì tôi phải liên kết với một thư viện boost.system hoặc làm cho dự án của tôi phụ thuộc vào thư viện boost.system.

Làm cách nào để buộc cmake liên kết với thư viện mà không cần mã hóa đường dẫn thư viện?

Ở đây kết quả từ otool:

otool -L /opt/local/lib/libboost_filesystem-mt.dylib 
/opt/local/lib/libboost_filesystem-mt.dylib: 
/opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0) 
/opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0) 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) 
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0) 
+0

Janusz, vui lòng thực hiện "otool -L /opt/local/lib/libboost_filesystem-mt.dylib" và cung cấp cho chúng tôi kết quả. Cảm ơn. –

Trả lời

60

Trên Linux CMake số liệu riêng của mình mà boost_filesystem được liên kết chống lại boost_system. Rõ ràng là bạn phải nói rõ ràng trên Mac:

find_package(Boost COMPONENTS system filesystem REQUIRED) 
#... 
target_link_libraries(mytarget 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
) 
+0

Điều này thật lạ lùng. Trên Linux, thư viện động boost.filesystem đề cập đến thư viện boost.system, do đó không cần liên kết rõ ràng với boost.system. Bất kỳ ý tưởng tại sao điều này không xảy ra ở đây? –

+0

Bạn cứng nhắc, ldd libboost_filesystem.so liệt kê libboost_system.so (0x00007fcd31e67000). AFAIK trên Mac "otool -L" tương đương với ldd, nhưng tôi không có Mac xung quanh. Chúng ta có nên làm điều này tại ML tăng cường? –

+9

Thay vì sử dụng $ {Boost_LIBRARIES}? Luôn luôn nên bao gồm mọi thứ được chỉ định bởi COMPONENTS, không? – LiMuBei

5

Đây không phải là câu trả lời cho câu hỏi được đăng, mà là một quan sát trên hộp Ubuntu của tôi.

Để sử dụng libs Boost, bạn phải viết một cách rõ ràng một cái gì đó như thế này:

find_package(Boost COMPONENTS regex system filesystem REQUIRED) 

Bên cạnh đó, bạn cần phải liên kết nó theo cách này:

target_link_libraries(binary 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
    ${Boost_REGEX_LIBRARY} 
) 

và theo cách sau didn' t làm việc, ít nhất là đối với tôi:

target_link_libraries(binary regex system filesystem) 

này sau những gì Maik nói, nhưng không chỉ trên máy Mac.

Các vấn đề liên quan