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?
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
).
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)
Si vous utilisez cmake, ajoutez la ligne suivante à CMakeLists.txt
:
link_libraries(stdc++fs)
Pour que cmake puisse être lié à la bibliothèque correspondante.
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