web-dev-qa-db-fra.com

erreur de linker experimental :: filesystem

J'essaie d'utiliser les nouvelles fonctionnalités de c ++ 1z à la tête du développement dans gcc 6.0.

Si j'essaie 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 go 
/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: error: ld a renvoyé 1 état de sortie 

la version gcc est l'instantané linux-gnu_6-20151011

Des astuces pour lier les nouvelles fonctionnalités de c ++ 1z?

69
Klaus

Le système de fichiers TS n’a rien à voir avec le support C++ 1z, c’est une spécification complètement séparée qui ne fait pas partie du brouillon de travail C++ 1z. L'implémentation de GCC (dans GCC 5.3 et versions ultérieures) est même disponible en mode C++ 11.

Il vous suffit de créer un lien avec -lstdc++fs pour l'utiliser.

(La bibliothèque concernée, libstdc++fs.a, est une bibliothèque statique, de sorte que, comme pour toute bibliothèque statique, elle devrait venir après tous les objets qui en dépendent dans la commande de l'éditeur de liens.)

pdate Nov 2017: ainsi que le système de fichiers TS, le tronc GCC maintenant a également une implémentation du système de fichiers C++ 17 bibliothèque, définie dans <filesystem> et dans l'espace de noms std::filesystem _ (NB: pas "expérimental" dans ces noms) lors de l'utilisation de -std=gnu++17 ou -std=c++17. La prise en charge de C++ 17 par GCC n’est pas encore complète ni stable et, jusqu’à ce qu’elle soit considérée comme prête à être utilisée en prime-time, vous devez également vous connecter à -lstdc++fs pour les fonctionnalités du système de fichiers C++ 17.

Mise à jour janvier 2019: à partir de GCC 9, le C++ 17 std::filesystem les composants peuvent être utilisés sans -lstdc++fs _ (mais vous avez toujours besoin de cette bibliothèque pour std::experimental::filesystem).

114
Jonathan Wakely

Avec Clang 4.0+, vous devez créer un lien avec libc++experimental.a

Assurez-vous que vous construisez avec libc ++ (pas libstdc ++) avec -stdlib = libc ++ (comme mentionné dans les commentaires)

12
xaxxon

Si vous utilisez cmake, ajoutez la ligne suivante à CMakeLists.txt:

link_libraries(stdc++fs)

Pour que cmake puisse être lié à la bibliothèque correspondante.

10
Searene

Voici une démo qui pourrait être utile à quelqu'un à l'avenir:

env: el6, gcc/5.5.0

#include <iostream>
#include <string>
#include <experimental/filesystem>

int main()
{
    std::string path = std::experimental::filesystem::current_path();

    std::cout << "path = " << path << std::endl;
}

Ce qui suit sont la compilation et les tests. Les drapeaux sont -std=c++17-lstdc++fs:

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/apps/gcc-5.5.0/bin/../libexec/gcc/x86_64-unknown-linux-gnu/5.5.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --prefix=/apps/gcc-5.5.0 --disable-multilib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=all
Thread model: posix
gcc version 5.5.0 (GCC)

$ ls -lrt /apps/gcc-5.5.0/lib64 | grep libstdc
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so.6.0.21
-rw-r--r--. 1 root root      2419 Jun 25 10:51 libstdc++.so.6.0.21-gdb.py
-rwxr-xr-x. 1 root root       976 Jun 25 10:51 libstdc++.la
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so
-rw-r--r--. 1 root root  10581732 Jun 25 10:51 libstdc++fs.a
-rw-r--r--. 1 root root  28985412 Jun 25 10:51 libstdc++.a
-rwxr-xr-x. 1 root root       916 Jun 25 10:51 libstdc++fs.la
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so.6

$ g++ filesystem-testing.cpp -lstdc++fs -std=c++17
$ ./a.out

$ g++ -std=c++17 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing

Cela fonctionne aussi avec les drapeaux: -std=c++11

$ g++ -std=c++11 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing

Les erreurs suivantes ont eu lieu lors de la compilation _ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev

$ g++ -std=c++17 -lstdc++fs filesystem-testing.cpp
/tmp/ccA6Q9oF.o: In function `main':
filesystem-testing.cpp:(.text+0x11): undefined reference to `_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev'
collect2: error: ld returned 1 exit status
3
caot