web-dev-qa-db-fra.com

Erreurs de liaison à l'aide des membres <filesystem> dans C ++ 17

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.

13
Willie Jeng

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.

13
S.M.

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.

3
Rick