Comment lier contre boost.système avec cmake
J'utilise un makefile généré par cmake pour compiler un fichier c++ qui dépend de la bibliothèque du système de fichiers boost.
Pendant le processus de liaison j'obtiens l'erreur suivante:
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
L'action du makefile qui génère cette erreur est cette ligne:
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
Certains googling m'ont montré que cette erreur semble être commune sur Mac avec la bibliothèque de système de fichiers boost parce que je dois lier contre un boost.bibliothèque système ou faire mon projet en fonction du coup de pouce.système bibliothèque.
Comment forcer cmake à lier la bibliothèque sans coder en dur le chemin de la bibliothèque?
Voici le résultat de 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)
2 réponses
Sous linux, CMake se rend compte que boost_filesystem est lié à boost_system. Évidemment, vous devez le dire explicitement sur Mac:
find_package(Boost COMPONENTS system filesystem REQUIRED)
#...
target_link_libraries(mytarget
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
)
Ce n'est pas une "réponse" à la question postée, mais une observation sur ma boîte Ubuntu.
Pour utiliser les libs Boost, vous devez écrire explicitement quelque chose comme ceci:
find_package(Boost COMPONENTS regex system filesystem REQUIRED)
En outre, vous devez le lier de cette façon:
target_link_libraries(binary
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_REGEX_LIBRARY}
)
Et la façon suivante n'a pas fonctionné, au moins pour moi:
target_link_libraries(binary regex system filesystem)
Cela suit ce que Maik dit, mais pas seulement sur Mac.