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 🙂


Log in to reply