undefined reference to std::experimental::filesystem
-
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
. Daslib
-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 dielibstdc++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.