J'essaye d'utiliser les nouvelles fonctionnalités de c ++ 1z pour le développement dans gcc 6.0.
Si j'essaye ce petit exemple:
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
fs::path p1 = "/home/pete/checkit";
std::cout << "p1 = " << p1 << std::endl;
}
J'ai eu:
/ opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 -g -o aller /tmp/ccaGzqFO.o: Dans la fonction \ `std :: experimental :: filesystem :: v1 :: __ cxx11 :: path :: path (char const (&) [36]) ': /opt/linux-gnu_6-20151011/include/c++/6.0.0/experimental/bits/fs_path.h:167: référence non définie à `std :: experimental :: filesystem :: v1 :: __ cxx11 :: path :: _ M_split_cmpts () ' collect2: erreur: ld a renvoyé 1 statut de sortie
la version gcc est le snapshot linux-gnu_6-20151011
Des conseils sur la manière de créer un lien pour les nouvelles fonctionnalités de c ++ 1z?
c++ -lstd++fs main.cpp
. J'utilisegcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
-lstdc++fs
doit être à la fin de la ligne (au moins après le fichier source). Je ne comprends pas pourquoi certains-lxxx
doivent être à la fin et d'autres non.Si vous utilisez cmake, ajoutez la ligne suivante à
CMakeLists.txt
:Pour que cmake puisse établir un lien avec la bibliothèque correspondante.
la source
target_link_libraries(hello_world_ stdc++fs)
et il a été compilé.Avec clang 4.0+, vous devez établir un lien avec
libc++experimental.a
Assurez-vous que vous construisez avec libc ++ (pas libstdc ++) avec -stdlib = libc ++ (comme mentionné dans les commentaires)
la source
-stdlib=libc++
orset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
Voici une démo qui pourrait être utile à quelqu'un à l'avenir:
env:
el6
,gcc/5.5.0
Les éléments suivants sont la compilation et les tests. Les drapeaux sont
-std=c++17
-lstdc++fs
:Cela fonctionne également avec les drapeaux:
-std=c++11
Ce qui suit avait une erreur de compilation
_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev
la source