¿Por qué GCC no parece tener la biblioteca estándar del sistema de archivos?

4 minutos de lectura

avatar de usuario de shadow
sombra

tengo un problema con la biblioteca del sistema de archivos, debería incluirse en el compilador c++ 17, después de 2 días intenté instalar gcc-7.0.2 en raspberry pi pero no funcionó, no pudo reconocer el comando gcc-7 o g++-7 o incluso -std=c++17 así que tuve que instalar g++-6 y gcc-6 usando apt-get install
de todos modos, después de instalar la versión 6, el compilador incluye c ++ 17. estoy usando bloques de código como IDE, tuve que agregar un nuevo compilador y agregar la opción -std=c++17 para habilitarlo, pero en el código principal cuando incluyo la biblioteca del sistema de archivos dice que no hay tal archivo o directorio.

mi pregunta es, ¿cómo puedo agregar el compilador c ++ 17 y su biblioteca (como el sistema de archivos) correctamente?

  • El hecho de que el interruptor diga “C++17” no significa que implemente todos de C++17.

    – Nicolás Bolas

    24 de agosto de 2017 a las 17:10

  • Más concretamente, sólo puede aplicar la idioma partes. los biblioteca las partes están fuera del alcance del compilador.

    – Ignacio Vázquez-Abrams

    24 de agosto de 2017 a las 17:12

  • @IgnacioVazquez-Abrams: Bueno, los interruptores del compilador también se usan para activar las partes de la biblioteca, ya que están incluidos con el compilador en la distribución. Pero tiene razón en que libstdc++ se actualiza por separado de gcc.

    – Nicolás Bolas

    24 de agosto de 2017 a las 17:15


  • @Nicol No se actualiza por separado en absoluto: las versiones específicas de GCC están estrechamente vinculadas a instantáneas específicas de libstdc ++. La numeración de la versión funciona ligeramente diferente y ambas se desarrollan de forma semiindependiente (según lo permita la implementación de características del lenguaje en el compilador).

    – rubenvb

    22 de agosto de 2018 a las 14:28

  • @Rick, probablemente tengas dos, aunque el más nuevo debería funcionar como un reemplazo directo del anterior.

    – rubenvb

    27 de noviembre de 2018 a las 15:44

Avatar de usuario de Galik
Galik

GCC v7 aun no implementa pero tiene la Especificación técnica del sistema de archivos Qué esta en

#include <experimental/filesystem>

// for brevity
namespace fs = std::experimental::filesystem;

int main()
{
    fs::path p = "/path/to/my/file"; // etc...
}

Esto también está disponible en GCC v6.

Para vincular con la biblioteca, debe agregar -lstdc++fs a la línea de comandos.

Nota: Puede haber algunas diferencias menores entre el actual Especificación técnica y el borrador final de eso lo decide el Comité de Normas.

Nota 2: GCC v8 ahora implementa con el -std=c++17 bandera.

  • así que era correcto que gcc v7 aún no se completara, de todos modos, agregar el sistema de archivos/experimental funciona bien, gracias por eso.

    – sombra

    24 de agosto de 2017 a las 17:27

  • @sombra Soporte para C++17 no está completo, no. Principalmente porque C++17 aún no ha sido finalizado por el Comité de Normas ISO. Probablemente tomará algunos meses después de eso para GCC para convertirse en característica completa.

    – Galik

    24 de agosto de 2017 a las 19:29


  • @Galik ¿Por qué GCC no estaría completo para cuando se publique C++ 17? El borrador de C++17 ha estado completo durante meses, y si estoy leyendo el proceso de estandarización cierto, no se publicará hasta algún tiempo después del 30 de octubre. Eso debería ser mucho tiempo, ya que son hecho con el lenguaje central y mayormente hecho con la biblioteca.

    – Daniel H.

    28 de agosto de 2017 a las 19:15

  • @DanielH Según los registros, el std::filesystem no llegó en GCC Hasta que v8.1 que fue publicado en May 2018 cual es más de 6 meses después de la C++17 Standard fue publicado. Incluso entonces se consideró “experimental” Hasta que GCC v9.1 que fue publicado en May 2019.

    – Galik

    21 de mayo de 2020 a las 10:56

  • Estoy usando GCC 9.3 en Ubuntu 20.04 y <filesystem> no funcionó (incluso con -std=c++17 bandera). Usar el experimental funcionó gracias a esta respuesta.

    – Sasan

    15 de abril de 2021 a las 8:40


Primero debes echar un vistazo a Compatibilidad con C++17 en GCC

CCG 8

Biblioteca de tiempo de ejecución (libstdc++)

  • Compatibilidad experimental mejorada para C++17, incluidas las siguientes características:
    • Guías de deducción para admitir la deducción de argumentos de plantilla de clase.
    • std::filesystem implementación.
    • std::char_traits<char> y std::char_traits<wchar_t> son utilizables en expresiones constantes.
    • std::to_chars y std::from_chars (solo para números enteros, no para tipos de punto flotante).

origen: https://gcc.gnu.org/gcc-8/cambios.html

CCG 9

Biblioteca de tiempo de ejecución (libstdc++)

  • Compatibilidad mejorada con C++17, que incluye:
    • La implementación de C++17 ya no es experimental.
    • Algoritmos paralelos y <execution> (requiere Thread Building Blocks 2018 o posterior).
    • <memory_resource>.
    • Uso de los tipos y funciones en <filesystem> no requiere vinculación con -lstdc++fs ahora.

origen: https://gcc.gnu.org/gcc-9/cambios.html

¿Ha sido útil esta solución?