descargar compiler compilador book c++ gcc c++17

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.