ubuntuusers.de

boost::filesystem Library einbinden

Status: Gelöst | Ubuntu-Version: Kubuntu 14.10 (Utopic Unicorn)
Antworten |

Mattze94

Anmeldungsdatum:
25. April 2014

Beiträge: 42

Hi,

ich versuche verzweifelt die Boost Library in mein aktuelles C++ Programm einzubinden. Genau genommen geht es nur um die boost::filesystem Bibliotheken. Leider bekomme ich beim Ausführen des Makefiles folgende Fehlermeldung:

CMakeFiles/main.dir/Main.cpp.o: In Funktion `__static_initialization_and_destruction_0(int, int)':
Main.cpp:(.text+0x1aa): Nicht definierter Verweis auf `boost::system::generic_category()'
Main.cpp:(.text+0x1b6): Nicht definierter Verweis auf `boost::system::generic_category()'
Main.cpp:(.text+0x1c2): Nicht definierter Verweis auf `boost::system::system_category()'
CMakeFiles/main.dir/Main.cpp.o: In Funktion `boost::filesystem::exists(boost::filesystem::path const&)':
Main.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x19): Nicht definierter Verweis auf `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/main.dir/Main.cpp.o: In Funktion `boost::filesystem::is_directory(boost::filesystem::path const&)':
Main.cpp:(.text._ZN5boost10filesystem12is_directoryERKNS0_4pathE[_ZN5boost10filesystem12is_directoryERKNS0_4pathE]+0x19): Nicht definierter Verweis auf `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/main.dir/Main.cpp.o: In Funktion `boost::filesystem::detail::dir_itr_imp::~dir_itr_imp()':
Main.cpp:(.text._ZN5boost10filesystem6detail11dir_itr_impD2Ev[_ZN5boost10filesystem6detail11dir_itr_impD5Ev]+0x24): Nicht definierter Verweis auf `boost::filesystem::detail::dir_itr_close(void*&, void*&)'
CMakeFiles/main.dir/Main.cpp.o: In Funktion `boost::filesystem::directory_iterator::directory_iterator(boost::filesystem::path const&)':
Main.cpp:(.text._ZN5boost10filesystem18directory_iteratorC2ERKNS0_4pathE[_ZN5boost10filesystem18directory_iteratorC5ERKNS0_4pathE]+0x57): Nicht definierter Verweis auf `boost::filesystem::detail::directory_iterator_construct(boost::filesystem::directory_iterator&, boost::filesystem::path const&, boost::system::error_code*)'
CMakeFiles/main.dir/Main.cpp.o: In Funktion `boost::filesystem::directory_iterator::increment()':
Main.cpp:(.text._ZN5boost10filesystem18directory_iterator9incrementEv[_ZN5boost10filesystem18directory_iterator9incrementEv]+0x19): Nicht definierter Verweis auf `boost::filesystem::detail::directory_iterator_increment(boost::filesystem::directory_iterator&, boost::system::error_code*)'
CMakeFiles/main.dir/Main.cpp.o: In Funktion `boost::filesystem::path::path<char*>(char* const&, boost::enable_if<boost::filesystem::path_traits::is_pathable<boost::decay<char*>::type>, void>::type*)':
Main.cpp:(.text._ZN5boost10filesystem4pathC2IPcEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE[_ZN5boost10filesystem4pathC5IPcEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE]+0x22): Nicht definierter Verweis auf `boost::filesystem::path::codecvt()'
CMakeFiles/main.dir/Main.cpp.o: In Funktion `boost::filesystem::path::path<boost::filesystem::directory_entry>(boost::filesystem::directory_entry const&, boost::enable_if<boost::filesystem::path_traits::is_pathable<boost::decay<boost::filesystem::directory_entry>::type>, void>::type*)':
Main.cpp:(.text._ZN5boost10filesystem4pathC2INS0_15directory_entryEEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE[_ZN5boost10filesystem4pathC5INS0_15directory_entryEEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE]+0x22): Nicht definierter Verweis auf `boost::filesystem::path::codecvt()'
Main.cpp:(.text._ZN5boost10filesystem4pathC2INS0_15directory_entryEEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE[_ZN5boost10filesystem4pathC5INS0_15directory_entryEEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE]+0x38): Nicht definierter Verweis auf `boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::string&, std::codecvt<wchar_t, char, __mbstate_t> const&)'
collect2: error: ld returned 1 exit status
CMakeFiles/main.dir/build.make:85: recipe for target 'main' failed
make[2]: *** [main] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:72: recipe for target 'all' failed
make: *** [all] Error 2

Erstelle die Makefile immer mithilfe von CMake. Die CMakeLists.txt sieht folgendermaßen aus:

cmake_minimum_required(VERSION 2.8)

project(SearchAndReplace)

find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})

add_executable(main Main.cpp)
target_link_libraries(main ${Boost_LIBRARY})

Im Programmcode habe ich selbstverständlich auch die <boost::filesystem.hpp> inkludiert. So wies ausschaut liegt das Problem auch eher beim Linker. Könnt ihr mir weiterhelfen? Vielen Dank.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

Mattze94 schrieb:

Im Programmcode habe ich selbstverständlich auch die <boost::filesystem.hpp> inkludiert. So wies ausschaut liegt das Problem auch eher beim Linker. Könnt ihr mir weiterhelfen? Vielen Dank.

Ja, das ist definitiv ein Linker-Problem. Ich kenne mich leider mit CMake aus, noch habe ich selber mit boost gearbeitet, deshalb kann ich nur mutmaßen. Vielleicht musst Du mehr als eine Bibliothek einbinden.

Mattze94

(Themenstarter)

Anmeldungsdatum:
25. April 2014

Beiträge: 42

Habe mal ein wenig im Internet gestöbert. Der Fehler scheint bekannt zu sein und soll angeblich durch Hinzufügen des Flags

-lboost_system

gelöst werden können. Leider kommt bei mir auch mit Flag die gleiche Fehlermeldung.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

Mattze94 schrieb:

Habe mal ein wenig im Internet gestöbert. Der Fehler scheint bekannt zu sein und soll angeblich durch Hinzufügen des Flags

-lboost_system

gelöst werden können. Leider kommt bei mir auch mit Flag die gleiche Fehlermeldung.

Ggf. ist die Reihenfolge falsch. Bei Linker-Optionen kommt es immer auf die Reihenfolge an. Ich würde die Kommandozeile, die am Ende von make ausgeführt wird mal manuell ausführen und dieses Flag an verschiedenen Stellen einfügen, um zu sehen, ob es das letztlich ist.

Mattze94

(Themenstarter)

Anmeldungsdatum:
25. April 2014

Beiträge: 42

Leider ohne Erfolg. Habe jetzt einfach mal "g++ Main.cpp -lboost_system" in die Kommandozeile gehämmert mit folgendem Ergebnis:

/tmp/ccrajKa9.o: In Funktion `boost::filesystem::exists(boost::filesystem::path const&)':
Main.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x19): Nicht definierter Verweis auf `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
/tmp/ccrajKa9.o: In Funktion `boost::filesystem::is_directory(boost::filesystem::path const&)':
Main.cpp:(.text._ZN5boost10filesystem12is_directoryERKNS0_4pathE[_ZN5boost10filesystem12is_directoryERKNS0_4pathE]+0x19): Nicht definierter Verweis auf `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
/tmp/ccrajKa9.o: In Funktion `boost::filesystem::path::path<char*>(char* const&, boost::enable_if<boost::filesystem::path_traits::is_pathable<boost::decay<char*>::type>, void>::type*)':
Main.cpp:(.text._ZN5boost10filesystem4pathC2IPcEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE[_ZN5boost10filesystem4pathC5IPcEERKT_PNS_9enable_ifINS0_11path_traits11is_pathableINS_5decayIS4_E4typeEEEvE4typeE]+0x22): Nicht definierter Verweis auf `boost::filesystem::path::codecvt()'
collect2: error: ld returned 1 exit status

Also ich habe das "libboost-all-dev"-Paket ganz normal aus den offiziellen Ubuntuquellen installiert. Keine Ahnung, warum er die Bibliotheken nicht findet?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

Mattze94 schrieb:

Also ich habe das "libboost-all-dev"-Paket ganz normal aus den offiziellen Ubuntuquellen installiert. Keine Ahnung, warum er die Bibliotheken nicht findet?

Er findet die Bibliothek, aber nicht die passenden Funktionen / Methoden. Hm... Ich würde auf jeden Fall mal Warnungen anschalten:

1
g++ -Wall Main.cpp -lboost_system

Moment, Du brauchst vermutlich "-lboost_filesystem". Du hast schlicht die falsche Bib eingebunden.

Mattze94

(Themenstarter)

Anmeldungsdatum:
25. April 2014

Beiträge: 42

Also Warnungen werden keine ausgegeben, er kommt ja nicht einmal bis zum compilen. Habe mal versucht nur die boost::filesystem Bib in die CMakeLists.txt einzubinden und bekam folgende Fehlermeldung:

/usr/bin/ld: /tmp/ccTziZVe.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.55.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Übrigens die gleiche Ausgabe als wenn ich es direkt über die command line mit "g++ -Wall Main.cpp -lboost_filesystem" versuche zu compilen. Leider kann ich damit wenig bis gar nichts anfangen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

Mattze94 schrieb:

Also Warnungen werden keine ausgegeben, er kommt ja nicht einmal bis zum compilen.

Was?!? Wenn er beim Linken Probleme hat, dann muss er das Compilieren erfolgreich hinter sich gebracht haben.

Habe mal versucht nur die boost::filesystem Bib in die CMakeLists.txt einzubinden und bekam folgende Fehlermeldung:

/usr/bin/ld: /tmp/ccTziZVe.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.55.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Übrigens die gleiche Ausgabe als wenn ich es direkt über die command line mit "g++ -Wall Main.cpp -lboost_filesystem" versuche zu compilen. Leider kann ich damit wenig bis gar nichts anfangen.

Dann füge halt beide boost Bibs hinzu. Sei doch mal ein bisschen experimentierfreudig.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

... oder Du aktivierst mal die Suchmaschine Deines Vertrauens™, und Du wirst das Thema auch bei der Konkurrenz finden ... 😉

LG,

track

Mattze94

(Themenstarter)

Anmeldungsdatum:
25. April 2014

Beiträge: 42

Was?!? Wenn er beim Linken Probleme hat, dann muss er das Compilieren erfolgreich hinter sich gebracht haben.

Da hast du natürlich recht, geistiger Aussetzer ^^

Dann füge halt beide boost Bibs hinzu. Sei doch mal ein bisschen experimentierfreudig.

Das hat in der Tat geholfen. Das Programm wird jetzt zumindestens vollständig kompiliert und gelinkt. Danke dafür. Ich war vorher nur davon ausgegangen "-lboost_system" würde "-lboost_filesystem" beinhalten und daher hat es für mich keinen Sinn ergeben, beide Flags zu setzen. Nächstes Mal bin ich schlauer.

Leider funktioniert es mit CMake immer noch nicht, wobei der folgender Fehler bei Ausführung des Makefiles dann wohl in der CMakeLists.txt stecken muss:

/usr/bin/ld: CMakeFiles/main.dir/Main.cpp.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/main.dir/build.make:86: recipe for target 'main' failed
make[2]: *** [main] Error 1
CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:72: recipe for target 'all' failed
make: *** [all] Error 2

Mit diesem "DSO missing" kann ich zum Beispiel gar nichts anfangen. Meine CMakeLists.txt sieht mittlerweile folgendermaßen aus:

cmake_minimum_required(VERSION 2.8)

project(SearchAndReplace)

set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -lboost_system -lboost_filesystem")

find_package(Boost COMPONENTS system filesystem REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

add_executable(main Main.cpp)
target_link_libraries(main ${Boost_LIBRARY} ${Boost_FILESYSTEM_LIBRARY})

Bei steigender Komplexität des Projekts ist CMake sehr angenehm, weshalb ich ungern darauf verzichten würde. Falls sich also jemand besser mit CMake auskennt, bin ich weiterhin an einer Lösung interessiert.

... oder Du aktivierst mal die Suchmaschine Deines Vertrauens™, und Du wirst das Thema auch bei der Konkurrenz finden ... 😉

Ist ja nicht so, als wäre ich da noch nicht drauf gekommen. Aber Make und C++ sind sehr empfindlich und können bei kleinen Unterschieden bereits eine riesige Streuung von Problemen hervorrufen. Da vertraue ich lieber auf den individuell zugeschnittenen Rat der hier ansässigen Experten 😉

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13211

Mattze94 schrieb:

Dann füge halt beide boost Bibs hinzu. Sei doch mal ein bisschen experimentierfreudig.

Das hat in der Tat geholfen. Das Programm wird jetzt zumindestens vollständig kompiliert und gelinkt. Danke dafür. Ich war vorher nur davon ausgegangen "-lboost_system" würde "-lboost_filesystem" beinhalten und daher hat es für mich keinen Sinn ergeben, beide Flags zu setzen. Nächstes Mal bin ich schlauer.

Das sind keine "Flags" sondern die Namen von Bibliotheken, die der Linker beim Linken benutzen soll. Unterschiedliche Bibliotheken ⇒ unterschiedlicher Inhalt.

Mit diesem "DSO missing" kann ich zum Beispiel gar nichts anfangen.

https://duckduckgo.com/?q=DSO+missing+from+command+line&ia=qa

... oder Du aktivierst mal die Suchmaschine Deines Vertrauens™, und Du wirst das Thema auch bei der Konkurrenz finden ... 😉

Ist ja nicht so, als wäre ich da noch nicht drauf gekommen. Aber Make und C++ sind sehr empfindlich und können bei kleinen Unterschieden bereits eine riesige Streuung von Problemen hervorrufen. Da vertraue ich lieber auf den individuell zugeschnittenen Rat der hier ansässigen Experten 😉

Dann sage ich Dir jetzt: nimm Java. 😉

Antworten |