web-dev-qa-db-fra.com

Comment établir un lien contre boost.system 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:

 Symboles non définis: 
 "Boost :: system :: get_generic_category ()", référencé à partir de: 
 __Static_initialization_and_destruction_0 (int, int) dans FaceRecognizer.cpp.o 
 __static_initialization_and_destruction_0 (int, int) dans FaceRecognizer.cpp.o 
 __static_initialization_and_destruction_0 (int, int) dans FaceRecognizer.cpp.o 
 "boost :: system :: get_system_category ()", référencé de: 
 __static_initialization_and_destruction_0 (int, int) dans FaceRecognizer.cpp.o 
 __static_initialization_and_destruction_0 (int, int) dans FaceRecognizer.cpp.o 
 ld: symbole (s) introuvable (s) 
 collect2: ld a renvoyé 1 état de sortie 
 make [2]: *** [src/ImageMarker] Erreur 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 

Une recherche sur Google m'a montré que cette erreur semble être courante sur les macs avec la bibliothèque du système de fichiers boost car je dois créer un lien avec une bibliothèque boost.system ou faire mon projet en fonction de la bibliothèque boost.system.

Comment forcer cmake à se lier à la bibliothèque sans coder en dur le chemin de la bibliothèque?

Voici le résultat d'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)
36
Janusz

Sous linux, CMake s'imagine 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}
)
71
Maik Beckmann

Ce n'est pas une "réponse" à la question posée, mais une observation sur ma box Ubuntu.

Pour utiliser les bibliothèques Boost, vous devez écrire explicitement quelque chose comme ceci:

find_package(Boost COMPONENTS regex system filesystem REQUIRED)

De plus, 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é, du moins pour moi:

target_link_libraries(binary regex system filesystem)

Cela suit ce que dit Maik, mais pas seulement sur Mac.

9
galactica