undefined reference to std::experimental::filesystem



  • Hi,

    ist mein erster Beitrag hier, deswegen erstmal ein freundliches Hallo in die Runde 🙂

    Ich habe in der Vergangenheit ein bisschen was in Java und C# gemacht, ich bin weit weg von fortgeschritten, aber auch kein totaler Anfänger mehr beim Programmieren.

    In C++ stehe ich jedoch noch gaaanz am Anfang, möchte mich da aber jetzt mal ranwagen. Heute ist es soweit und ich bin auf mein erstes Problem gestoßen, dass ich alleine noch nicht lösen konnte. Würde mich freuen wenn mir dabei jemand helfen mag 🙂

    Und zwar: ich möchte die Dateiattribute von einer Textdatei auslesen (genauer gesagt das "Modifiziert am" Datum), das ganze soll unter Windows und Linux funktionieren.
    Ich könnte dafür jetzt GetFileAttributesA aus der WinAPI auf dem Windows System benutzen und stat() auf dem Linux System (glaube ich zumindest). Oder boost benutzen.

    Beim recherchieren bin ich aber dann auch auf "std::experimental::filesystem" gestoßen, dass es seit C++17 geben soll. Die Idee die Standardbibliothek dafür zu benutzen gefällt mir eigentlich am besten.
    Leider habe ich wohl Probleme die korrekt einzubinden?

    Folgender Beispielcode den ich gefunden habe:

    #include <string>
    #include <iostream>
    #include <experimental/filesystem>
    namespace fs = std::experimental::filesystem;
    
    int main() {
            std::string path = fs::current_path();
            std::cout << "path = " << path << std::endl;
            return 0;
    }
    

    Funktioniert jedenfalls nicht wegen undefined reference to `std::experimental::filesystem::v1::current_pathabi:cxx11

    Und das obwohl ich in CodeLite "-std=c++17" und "libstdc++fs" sowohl unter den Compiler -Optionen als auch unter den Linker -Optionen gesetzt habe! Das scheint bei allen Threads, die ich so beim googlen gefunden habe das Problem gewesen zu sein.

    Wenn ich das experimental weglasse meckert er übrigens schon beim #include. Aber ich hab auch gelesen dafür bräuchte man dann g++ >= 8 (ich benutze 7.4.0 und übrigens Linux Mint).

    Was mache ich denn falsch? 😞
    Danke vielmals im Voraus und schönes Wochenende!



  • Wie sieht denn die Kommandozeile beim Aufruf des gcc aus?
    Dort muß dann

    -lstdc++fs
    

    als Linker-Option enthalten sein (und der Pfad dafür muß per -L angegeben sein).



  • Oh cool, das funktioniert schonmal, Danke! 🙂

    Interessant, ich brauche also gar nicht "libstdc++fs" sondern "-lstdc++fs" ?
    Sieht ja fast gleich aus, ist es aber nicht.

    Hab das auch in CodeLite jetzt so eingetragen, unter Compiler und Linker, aber da funktioniert es bisher leider noch nicht:/



  • Ja, die volle Kommandozeile würde weiterhelfen, denn auch mit -lstdc++fs kann es zu diesem Fehler kommen, wenn die Bibliothek z.B. vor den Objektdateien gelinkt wird, welche diese verwenden. -lstdc++fs sollte als letzte Option an den Linker übergeben werden (Link-Reihenfolge wichtig - zuerst die Dateien, welche Bibliotheks-Symbole verwenden und dann die Bibliothek/Objekt-Datei mit der diese Referenzen aufgelöst werden können. Also ... main.o -lstdc++fs und nicht ... -lstdc++fs main.o).

    @Floyd_87 Die Library-Datei heisst libstdc++fs.a. Gelinkt wird diese aber mit -lstdc++fs. Das lib-Präfix wird aus historischen Gründen weggelassen und -l ist die Linker-Option. Daher ist wichtig zu sehen, was tatsächlich an den Compiler/Linker übergeben wird.



  • Vielen Dank an euch beide, das hilft mir sehr!

    Ich hab in CodeLite unter Linker-Options jetzt nur noch "-lstdc++fs" eingetragen. Ich kann da die Reihenfolge nicht ändern, steht an zweiter Stelle.
    Der volle Output unter "build" lautet:

    /bin/sh -c '/usr/bin/make -j4 -e -f  Makefile'
    ----------Building project:[ hmpf - Debug ]----------
    make[1]: Entering directory '/home/floyd/Dev/source/repos/cpp/grml/hmpf'
    /usr/bin/g++ -o ./Debug/hmpf @"hmpf.txt" -L.
    ./Debug/main.cpp.o: In function `main':
    /home/floyd/Dev/source/repos/cpp/grml/hmpf/main.cpp:7: undefined reference to `std::experimental::filesystem::v1::current_path[abi:cxx11]()'
    collect2: error: ld returned 1 exit status
    hmpf.mk:76: recipe for target 'Debug/hmpf' failed
    make[1]: *** [Debug/hmpf] Error 1
    make[1]: Leaving directory '/home/floyd/Dev/source/repos/cpp/grml/hmpf'
    Makefile:4: recipe for target 'All' failed
    make: *** [All] Error 2
    ====2 errors, 0 warnings====
    

    Ich glaube es geht dir um diese Zeile:

    /usr/bin/g++ -o ./Debug/hmpf @"hmpf.txt" -L.
    

    Der linkt überhaupt nix und gibt nur die output Datei mit -o an, oder?



  • @Floyd_87 sagte in undefined reference to std::experimental::filesystem:

    Ich glaube es geht dir um diese Zeile:

    /usr/bin/g++ -o ./Debug/hmpf @"hmpf.txt" -L.
    

    Der linkt überhaupt nix und gibt nur die output Datei mit -o an, oder?

    @"hmpf.txt" ist eine Linker/Compiler-Input-Datei aus der weitere Flags gelesen werden. In dieser findest du wahrscheinlich die Linker-Optionen für die libstdc++fs (oder auch nicht, dann wundert mich die Fehlermeldung überhaupt nicht)



  • ./Debug/main.cpp.o

    steht da drin, sonst nichts.



  • @Floyd_87 sagte in undefined reference to std::experimental::filesystem:

    ./Debug/main.cpp.o

    steht da drin, sonst nichts.

    Na dann kein Wunder. Offenbar hatte das libstdc++fs-Häkchen in CodeLite keinen Effekt.

    Schau mal, ob du in der IDE irgendwo direkt zusätzliche Compiler/Linker-Flags angeben kannst und füge dann -lstdc++fs hinzu.

    Edit: Und schau natürlich dann nochmal in der Ausgabe, dass dann im Compiler-Aufruf zuerst @"hmpf.txt" und erst dann -lstdc++fs steht.



  • Juhu, ihr seid super 1000 Dank 🙂

    -lstdc++fs muss in den Project Settings (Rechtsklick auf das Projekt in dem TreeView) und dann unter Linker -> Linker Options eingetragen werden (für die zukünftigen googler) und nicht unter Settings -> Build Settings -> Linker Options

    Vielen, vielen Dank, jetzt kann ich weitercoden 🙂



  • Hallo zusammen,
    auch ich möchte das filesystem unter CodeLite benutzen - habe den Chat oben verfolgt und komme einfach nicht drauf, wo ich das -lstdc++fs nun eintragen muss.

    Wenn ich es wie von Finnegan beschrieben unter Projekt/Linker/Linker Options eintrage,

    Projekt / Linker / Linker Options -lstdc++fs

    steht beim Programmaufruf nichts davon in der Zeile:

    C:\WINDOWS\system32\cmd.exe /C mingw32-make.exe -j 8 -e -f Makefile
    "----------Building project:[ CTests - Debug ]----------"
    mingw32-make.exe[1]: Entering directory 'C:/MAUS/rat/CTests'

    gcc -c "C:/MAUS/rat/CTests/main.cpp" -g -O0 -Wall -o ./Debug/main.cpp.o -I. -I.

    C:/MAUS/rat/CTests/main.cpp:8:21: error: 'filesystem' is not a namespace-name
    namespace fs = std::filesystem;

    Gibt es irgendwo eine step by step Anleitung, wo genau was stehen sollte???

    Dank Euch für Eure Hilfe,

    System ist: CodeLite, MinGW 8.2.0-5



  • Das ist bei dir ein Compiler-Fehler, kein Linker-Fehler (die eingetragene Linker-Option ist aber schonmal richtig).
    Welchen Header hast du denn dazu eingebunden?

    Ab C++17 ist die Filesystem library Teil des Standards (und nicht mehr experimentell), dazu müßtest du aber dann dem gcc noch die Option dafür mitgeben: -std=c++17



  • Whow bist Du schnell! Dank Dir!

    Der Code enthält lediglich:

    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <filesystem>

    namespace fs = std::filesystem;

    int main(int argc, char **argv)
    {

    ...
    Nachtrag: Den -std=c++17 Eintrag kann ich leider nicht verwenden... denn dann findet der Compiler zig Fehler in den zugrundeliegenden Files - ich bin echt verzweifelt!

    C:\WINDOWS\system32\cmd.exe /C mingw32-make.exe -j 8 -e -f Makefile
    "----------Building project:[ CTests - Debug ]----------"
    mingw32-make.exe[1]: Entering directory 'C:/MAUS/rat/CTests'
    gcc -c "C:/MAUS/rat/CTests/main.cpp" -g -O0 -Wall -std=c++17 -o ./Debug/main.cpp.o -I. -I.
    In file included from c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\filesystem:37,
    from C:/MAUS/rat/CTests/main.cpp:6:
    c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\bits\fs_path.h: In member function 'std::filesystem::__cxx11::path& std::filesystem::__cxx11::path::operator/=(const std::filesystem::__cxx11::path&)':
    c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\bits\fs_path.h:237:47: error: no match for 'operator!=' (operand types are 'std::filesystem::__cxx11::path' and 'std::filesystem::__cxx11::path')
    || (__p.has_root_name() && __p.root_name() != root_name()))
    ~~~~^~
    In file included from c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\iosfwd:40,
    from c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\ios:38,
    from c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\ostream:38,
    from c:\mingw\lib\gcc\mingw32\8.2.0\include\c++\iostream:39,
    from C:/MAUS/rat/CTests/main.cpp:2:



  • Das scheint ein Bug zu sein: #737 can't include <filesystem> with mingw-w64 8.1 .

    Kannst du auf eine neuere Version (mit gcc 9.x) updaten?



  • Hmm... kann ich versuchen ... melde mich wieder



  • 😤 👏 🤗
    Dank Dir!!!! Fehler ist weg!
    Mensch... da saß ich nun Tage und war am Verzweifeln!
    Vielen vielen Dank!!!



  • Bitte sehr. 🙂


Anmelden zum Antworten