Link gegen stdc++fs?



  • Hallo,

    ich versuche in meinem Projekt unter Linux das std::filesystem der STL zu nutzen, Windows & Linux (Debian). Windowsseitig alles okay, Linuxseitig habe ich Probleme beim Linken:

    undefined reference to `std::filesystem::__cxx11::path::parent_path() const
    

    Ich entwickle mit VS2019, CrossCompiling via VirtualBox - Debian11 und G++ Version 8. Die Suche im Netz ergab bereits, dass ich gegen stdc++fs linken muss. Ich bin ehrlich gesagt etwas überfgragt, an welche Stelle ich das in den Projekteinstellungen von VS hinterlegen muss. Ich dachte eigentlich im Linkerbereich. Versuche habe ich es unter <Linker/Eingabe/Zusätzliche Abhängigkeiten> mit eben dem Wert stdc++fs.

    Hier bekomme ich aber plötzlich die Fehlermeldung:

    stdc++fs: Datei oder Verzeichnis nicht gefunden
    

    Kann jemand helfen?

    Vielen Dank im Voraus

    VG Torsten


  • Mod

    Ich weiß jetzt nicht, wie man das bei VS einträgt, aber wenn du dem Linker von GCC mitteilen möchtest, dass er eine Bibliothek berücksichtigen soll, dann geht das über den '-l' Parameter, also hier '-lstdc++fs'. Dadurch sucht der dann nach der neuesten vorhandenen Datei 'libstc++fs.so.{version}'. Muss es natürlich auf dem System geben, sollte es aber auch bei einem GCC Version 8. Jedenfalls ist das mit dem -l der Aufruf, den deine IDE dann letztlich erzeugen muss. Wenn du sicher bist, dass sie das tut und ein Fehler dieser Art immer noch kommt, dann muss man weiter gucken.



  • G' Morgen,

    also ich habe jetzt mal auf der VM die Bibliothek gesucht:

    find -name libstdc++fs* 2>/dev/null
    ./usr/lib/gcc/x86_64-linux-gnu/8/libstdc++fs.a
    

    Die Suche nach libstdc++*:

    find -name libstdc++* 2>/dev/null
    ./usr/share/doc/libstdc++6
    ./usr/share/doc/libstdc++-8-dev
    ./usr/share/doc/gcc-8-base/C++/libstdc++_symbols.txt.amd64
    ./usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25-gdb.py
    ./usr/lib/gcc/x86_64-linux-gnu/8/libstdc++.so
    ./usr/lib/gcc/x86_64-linux-gnu/8/libstdc++fs.a
    ./usr/lib/gcc/x86_64-linux-gnu/8/libstdc++.a
    ./usr/lib/x86_64-linux-gnu/libstdc++.so.6
    ./usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
    ./var/lib/dpkg/info/libstdc++6:amd64.symbols
    ./var/lib/dpkg/info/libstdc++-8-dev:amd64.list
    ./var/lib/dpkg/info/libstdc++6:amd64.md5sums
    ./var/lib/dpkg/info/libstdc++6:amd64.prerm
    ./var/lib/dpkg/info/libstdc++6:amd64.shlibs
    ./var/lib/dpkg/info/libstdc++6:amd64.triggers
    ./var/lib/dpkg/info/libstdc++-8-dev:amd64.md5sums
    ./var/lib/dpkg/info/libstdc++6:amd64.postinst
    ./var/lib/dpkg/info/libstdc++6:amd64.list
    

    Es scheint keine dynamische Bibliothek zu geben, die Ausgabe an sich scheint okay zu sein.

    VG Torsten


  • Mod

    Kannst du auf der VM-Kommandozeile ein minimales Beispiel von Hand compilieren und linken? Also so etwas wie

    g++ mein_fs_hello_world.cpp -lstdc++fs
    

    Um zu prüfen, ob da an sich etwas falsch auf der VM ist, oder ob das an den Einstellungen in VS liegt.

    An sich ist das nämlich wohl normal (wie ich gerade nachlese), dass das nicht als dynamische Bibliothek kommt (Aus Gründen…). Aber mit -lstdc++fs sollte der das dann trotzdem korrekt linken können. Der Teil würde dann halt statisch mit in der Executable landen.



  • Hallo,

    also auf der VM direkt lässt es sich bauen und starten.

    #include <filesystem>
    #include <iostream>
    
    signed main()
    {
            auto currentPath = std::filesystem::current_path();
    
            std::cout << "path = " << currentPath.string().c_str() << std::endl;
            return 0;
    }
    
    debianx64@debianx64:~$ g++ main.cpp -std=c++17 -lstdc++fs && ./a.out
    path = /home/debianx64
    

    Ich vermute, dass ich nun einfach nur die richtige Stelle in den VS Projekteinstellungen finden muss.

    VG Torsten


  • Mod

    Gut, dann ist das wenigstens geklärt. Leider muss ich an dieser Stelle aber mangels Wissen über VS-Einstellungen aussteigen.



  • Kein Problem,

    hast mir sehr gut geholfen, danke dir 🙂

    VG Torsten



  • @TorDev sagte in Link gegen stdc++fs?:

    Versuche habe ich es unter <Linker/Eingabe/Zusätzliche Abhängigkeiten> mit eben dem Wert stdc++fs.

    Laut Linker Properties (Linux C++) sollte "stdc++fs" unter "Library Dependencies" (auf deutsch sowas wie "Bibliothek Abhängigkeiten") eingetragen werden.


Anmelden zum Antworten