2009-06-30 3 views
28

Я использую созданный cmake файл makefile для компиляции файла C++, который зависит от библиотеки файловой системы boost.Как связать с boost.system с cmake

В процессе связующей я получаю следующее сообщение об ошибке:

 
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 

Действие от Makefile, который генерирует эту ошибку эта строка:

 
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 

Некоторые прибегая к помощи показал мне, что эта ошибка, кажется, быть обычным для Mac с библиотекой файловой системы boost, потому что мне нужно связать с библиотекой boost.system или сделать мой проект в зависимости от библиотеки boost.system.

Как заставить cmake связываться с библиотекой без жесткого кодирования пути библиотеки?

Вот результат от 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, пожалуйста, сделайте «otool -L /opt/local/lib/libboost_filesystem-mt.dylib» и дайте нам результат. Спасибо. –

ответ

60

В Linux CMake цифры в том, что boost_filesystem связан с boost_system. Очевидно, что вы должны сказать это явно на Mac:

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

Это странно. В Linux динамическая библиотека boost.filesystem относится к библиотеке boost.system, поэтому нет явной привязки к boost.system. Любая идея, почему этого не происходит здесь? –

+0

Вы - rigth, ldd libboost_filesystem.so перечисляет libboost_system.so (0x00007fcd31e67000). AFAIK на Mac «otool -L» эквивалентен ldd, но у меня нет Mac. Должны ли мы воспитывать это при повышении ML? –

+9

Как насчет использования $ {Boost_LIBRARIES}? Должно всегда включать все, что указано КОМПОНЕНТАМИ, нет? – LiMuBei

5

Это не «ответ» на публикуемый вопрос, но наблюдение на моей машине Ubuntu.

Чтобы использовать подпиточного LIBS, вы должны явно написать что-то вроде этого:

find_package(Boost COMPONENTS regex system filesystem REQUIRED) 

Кроме того, вам нужно связать это следующим образом:

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

и следующим образом Ждут» t работы, по крайней мере для меня:

target_link_libraries(binary regex system filesystem) 

Это следует за тем, что говорит Майк, но не только на Mac.

 Смежные вопросы

  • Нет связанных вопросов^_^