2009-06-30 6 views
28

Ich benutze einen Cmake erzeugt Make-Datei eine C++ Datei zu kompilieren, die auf der Boost-Dateisystem-Bibliothek abhängt.Wie verknüpfen gegen Boost.System mit cmake

Während der Verknüpfung ich die folgende Fehlermeldung erhalten:

 
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 

Die Aktion von der Make-Datei, die diesen Fehler erzeugt, ist diese Zeile:

 
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 

Einige Googeln hat mir gezeigt, dass dieser Fehler scheint seine gemeinsam auf macs mit der Boost-Dateisystem-Bibliothek, weil ich gegen eine Boost.System Bibliothek verknüpfen oder mein Projekt machen auf der Boost.System Bibliothek abhängig.

Wie erzwinge ich Cmake gegen die Bibliothek zu verknüpfen, ohne den Bibliothekspfad zu?

Hier das Ergebnis von 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, bitte tun "otool -L /opt/local/lib/libboost_filesystem-mt.dylib" und geben Sie uns das Ergebnis. Danke. –

Antwort

60

Unter Linux CMake Zahlen selbst, dass boost_filesystem gegen boost_system verbunden ist. Offensichtlich haben Sie es zu sagen, explizit auf Mac:

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

Das ist bizarr. Unter Linux bezieht sich die dynamische Bibliothek boost.filesystem auf die Bibliothek boost.system, daher ist keine explizite Verknüpfung zu boost.system erforderlich. Irgendeine Idee, warum das hier nicht passiert? –

+0

Sie sind rigth, LDD libboost_filesystem.so Listen libboost_system.so (0x00007fcd31e67000). AFAIK auf Mac "Otool -L" ist das Äquivalent zu LDD, aber ich habe keinen Mac herum. Sollten wir das bei der Boost-ML aufbringen? –

+9

Wie wäre es stattdessen mit $ {Boost_LIBRARIES}? Sollte immer alles enthalten sein was von COMPONENTS angegeben wird, nein? – LiMuBei

5

Dies ist keine „Antwort“ auf die Frage geschrieben, aber eine Beobachtung auf meinem Ubuntu-Box.

die Boost-Bibliotheken verwenden, haben Sie so etwas wie dies explizit schreiben:

find_package(Boost COMPONENTS regex system filesystem REQUIRED) 

Darüber hinaus müssen Sie es auf diese Weise verknüpfen:

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

und die folgende Art und Weise didn‘ t Arbeit, zumindest für mich:

Dies folgt, was Maik sagt, aber nicht nur auf Mac.