J'utilise gcc 7.2 sur Ubuntu 16.04 et j'ai besoin d'utiliser la nouvelle bibliothèque de système de fichiers de C++ 17. Même s'il existe en effet une bibliothèque appelée experimental/filesystem, je ne peux utiliser aucun de ses membres. Par exemple, lorsque j'essaie de compiler ce fichier:
#include <iostream>
#include <string>
#include <experimental/filesystem>
using namespace std;
namespace fs = std::experimental::filesystem::v1;
int main(){
fs::path p1 = "/usr/share/";
}
Je reçois une erreur de compilation qui ressemble à ceci:
$ g++-7 test.cpp -std=c++17
/tmp/ccfsMnlG.o: In function `std::experimental::filesystem::v1::__cxx11::path::path<char [12], std::experimental::filesystem::v1::__cxx11::path>(char const (&) [12])':
test.cpp:(.text._ZNSt12experimental10filesystem2v17__cxx114pathC2IA12_cS3_EERKT_[_ZNSt12experimental10filesystem2v17__cxx114pathC5IA12_cS3_EERKT_]+0x73): undefined reference to `st
d::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
Qu'est-ce que je fais mal? Je ne pense pas qu'il y ait quelque chose de mal avec le code, car je viens de le copier-coller à partir d'un site Web. Suis-je en train d'utiliser la mauvaise version de gcc? Aussi, pourquoi ai-je besoin de <experimental/filesystem>
au lieu de simplement <filesystem>
en C++ 17? Merci d'avance.
Ajoutez le drapeau -lstdc++fs
:
$ g++-7 test.cpp -std=c++17 -lstdc++fs
gcc 7.2 prend uniquement en charge l'espace de noms expérimental C++ 17 filesystem
. Je ne sais pas, peut-être que gcc 7.3 prend déjà en charge l'espace de noms std filesystem
.
Vous pouvez également Sudo apt install g++-8
et utilise #include <filesystem>
comme cppreference décrit au lieu de #include <experimental/filesystem>
dans les anciennes versions de g ++ et libstdc ++.
Si j'installe gcc 8 dans Ubuntu, est-ce que j'aurai 2 bibliothèques libstdc ++ différentes ou simplement l'original mis à jour?
vous en aurez probablement deux, même si le plus récent devrait fonctionner en remplacement de l'ancien.
Je remarque qu'un libstdc++-8-dev
est installé avec g++-8
.
Cela fonctionne pour moi:
g++-8 -g -Wall -std=c++17 test.cpp -lstdc++fs
Il semble que même avec g ++ - 8, la bibliothèque du système de fichiers n'est pas automatiquement liée, vous devez toujours fournir -lstdc++fs
, et -std=c++17
est également nécessaire au niveau de la langue.