Ich versuche, die neuen c ++ 1z-Funktionen tatsächlich auf dem Kopf der Entwicklung in gcc 6.0 zu verwenden.
Wenn ich dieses kleine Beispiel versuche:
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
fs::path p1 = "/home/pete/checkit";
std::cout << "p1 = " << p1 << std::endl;
}
Ich habe:
/ opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 -g -o go /tmp/ccaGzqFO.o: In der Funktion \ `std :: experimentelle :: Dateisystem :: v1 :: __ cxx11 :: Pfad :: Pfad (char const (&) [36]) ': /opt/linux-gnu_6-20151011/include/c++/6.0.0/experimental/bits/fs_path.h:167: undefinierter Verweis auf `std :: experimentelle :: Dateisystem :: v1 :: __ cxx11 :: Pfad :: _ M_split_cmpts () ' collect2: error: ld hat 1 Exit-Status zurückgegeben
gcc version ist der snapshot linux-gnu_6-20151011
Irgendwelche Hinweise, wie man für die neuen c ++ 1z-Funktionen verlinkt?
c++ -lstd++fs main.cpp
. Ich benutzegcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
-lstdc++fs
muss am Ende der Zeile stehen (mindestens nach der Quelldatei). Ich verstehe nicht, warum einige-lxxx
am Ende sein müssen und andere nicht.Wenn Sie cmake verwenden, fügen Sie die folgende Zeile hinzu
CMakeLists.txt
:Damit kann cmake mit der entsprechenden Bibliothek verknüpfen.
quelle
target_link_libraries(hello_world_ stdc++fs)
und es kompiliert.Mit clang 4.0+ müssen Sie dagegen verlinken
libc++experimental.a
Stellen Sie sicher, dass Sie mit libc ++ (nicht libstdc ++) mit -stdlib = libc ++ erstellen (wie in den Kommentaren erwähnt).
quelle
-stdlib=libc++
oderset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
Hier ist eine Demo, die in Zukunft für jemanden hilfreich sein könnte:
env:
el6
,gcc/5.5.0
Im Folgenden werden kompiliert und getestet. Die Flaggen sind
-std=c++17
-lstdc++fs
:Es funktioniert auch mit Flags:
-std=c++11
Das Folgende hatte einen Kompilierungsfehler
_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev
quelle