undefined reference to std::experimental::filesystem



  • 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