compiler - gcc c++
experimental:: error del enlazador del sistema de archivos (4)
Intento usar las nuevas funciones de c ++ 1z en la cabeza del desarrollo dentro de gcc 6.0.
Si intento este pequeño ejemplo:
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
fs::path p1 = "/home/pete/checkit";
std::cout << "p1 = " << p1 << std::endl;
}
Tengo:
/opt/linux-gnu_6-20151011/bin/g++ --std=c++1z main.cpp -O2 -g -o go /tmp/ccaGzqFO.o: In function /`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: undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'' collect2: error: ld returned 1 exit status
La versión de gcc es la instantánea linux-gnu_6-20151011
¿Alguna pista sobre cómo vincular las nuevas funciones de c ++ 1z?
Aquí hay una demostración que podría ser útil para alguien en el futuro:
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;
}
Lo siguiente es compilar y probar.
Las banderas son
-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
También funciona con banderas:
-std=c++11
$ g++ -std=c++11 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing
El siguiente error de compilación
_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
Con clang 4.0+, debe vincular contra
libc++experimental.a
Asegúrese de construir con libc ++ (no libstdc ++) con -stdlib = libc ++ (como se menciona en los comentarios)
El sistema de archivos TS no tiene nada que ver con el soporte de C ++ 1z, es una especificación completamente separada que no forma parte del borrador de trabajo de C ++ 1z. La implementación de GCC (en GCC 5.3 y posterior) está incluso disponible en modo C ++ 11.
Solo necesita vincular con
-lstdc++fs
para usarlo.
(La biblioteca relevante,
libstdc++fs.a
, es una biblioteca estática, por lo que, como con cualquier biblioteca estática, debe aparecer
después de
cualquier objeto que dependa de ella en el comando del enlazador)
Actualización de noviembre de 2017:
además del sistema de archivos TS, el enlace troncal GCC ahora
también
tiene una implementación de la biblioteca del sistema de archivos C ++ 17, definida en
<filesystem>
y en el espacio de nombres
std::filesystem
(NB no "experimental" en esos nombres) cuando usando
-std=gnu++17
o
-std=c++17
.
El soporte C ++ 17 de GCC aún no es completo o estable, y hasta que se considere listo para su uso en horario de máxima audiencia, también debe vincular a
-lstdc++fs
para las características del sistema de archivos C ++ 17.
Actualización de enero de 2019: a
partir de GCC 9, los componentes de C ++ 17
std::filesystem
se pueden usar sin
-lstdc++fs
(pero aún necesita esa biblioteca para
std::experimental::filesystem
).
Si está utilizando cmake, agregue la siguiente línea a
CMakeLists.txt
:
link_libraries(stdc++fs)
Para que cmake pueda vincularse contra la biblioteca correspondiente.