14 votes

Erreurs de liens utilisant des membres <filesystem> en C++17

J'utilise gcc 7.2 sur Ubuntu 16.04, et j'ai besoin d'utiliser la nouvelle bibliothèque filesystem de C++17. Bien qu'il existe effectivement 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/";
}

J'obtiens 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 de travers ? Je ne pense pas qu'il y ait de problème avec le code, puisque je l'ai juste copié-collé d'un site web. Est-ce que j'utilise la mauvaise version de gcc ? Aussi, pourquoi ai-je besoin de <experimental/filesystem> au lieu de <filesystem> en C++17 ? Merci d'avance.

13voto

S.M. Points 7691

Ajouter le drapeau -lstdc++fs :

$ g++-7 test.cpp -std=c++17 -lstdc++fs

gcc 7.2 supporte C++17 experimental filesystem uniquement. Je ne sais pas, peut-être que gcc 7.3 supporte std filesystem déjà.

4voto

Rick Points 1507

Vous pouvez également sudo apt install g++-8 et utiliser #include <filesystem> en tant que référence cpp décrite au lieu de #include <experimental/filesystem> dans les anciennes versions de g++ et de libstdc++.

Si j'installe gcc 8 dans Ubuntu, est-ce que j'aurai 2 bibliothèques libstdc++ différentes ou est-ce que la bibliothèque originale sera simplement mise à jour ?

vous en aurez probablement deux, même si le plus récent devrait pouvoir remplacer l'ancien.

Je constate qu'un libstdc++-8-dev est installé en même temps que 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 y -std=c++17 est également nécessaire au niveau linguistique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X