Encabezado del sistema de archivos macOS Clang C++17 no encontrado

7 minutos de lectura

avatar de usuario
snoato

Necesito escribir un programa usando el (experimental) C++17 biblioteca del sistema de archivos pero clang en mi Mac (mac OS 10.12.03) no parece tener el encabezado del sistema de archivos incluido.

Ya que estoy obligado a usar el C++17no puedo usar alternativas como la Boost biblioteca.

Cuando trato de compilar un programa de muestra que solo incluye un sistema de archivos y iostream (y escribe a cout)

#include <filesystem>
#include <iostream>
using namespace std;

int main(){
    cout << "test" << endl;
}

Recibo el siguiente mensaje de error:

>clang test.cpp -std=c++1z

test.cpp:2:10: fatal error: 'filesystem' file not found
#include <filesystem>
         ^
1 error generated.

Cuando intento lo mismo usando GCC 6.3 (instalado a través de homebrew) obtengo:

>gcc-6 test.cpp  -std=c++17 
test.cpp:2:22: fatal error: filesystem: No such file or directory
 #include <filesystem>
                      ^
compilation terminated.

También intenté usar experimental/filesystem en lugar de compilar usando gcc pero parece intentar compilar para iOS, lo que genera otro error que parece estar relacionado con iostream

Undefined symbols for architecture x86_64:
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccd5QiVt.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccd5QiVt.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

La versión de mi clang es:

>clang --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Estoy agradecido por cualquier aporte útil ya que no pude encontrar nada que resolviera mi problema hasta ahora (aunque podría haber estado buscando los términos incorrectos).

Si necesita más información con gusto se la proporcionaré pero espero haber incluido todo.

  • Si la tarea tiene un requisito para esto, ¿quizás el instructor debería haberle dicho cómo lograrlo realmente (compilador e indicadores del compilador)?

    – crashmstr

    06/03/2017 a las 19:48

  • Bueno, él solo usa Linux, así que no sabía cómo hacerlo en una Mac…

    – snoato

    6 de marzo de 2017 a las 19:59

  • @DeiDei Libc++ (Clang) no se enviará <filesystem> en 4.0.

    – EricWF

    06/03/2017 a las 20:22

  • Si realmente tiene que hacer esto con C ++ 17, instale una máquina virtual Linux en su Mac o vea si algo como cerveza casera todavía tiene soporte para el sistema de archivos C++17 +.

    – Pablo R.

    06/03/2017 a las 22:14

  • Para el caso gcc esto puede ayudar

    – Shafik Yaghmour

    6 de marzo de 2017 a las 22:18

avatar de usuario
EricWF

Libc++, que es la biblioteca estándar de C++ en OS X, no se ha movido <experimental/filesystem> a <filesystem> sin embargo, porque la especificación no es estable.

Ojalá <filesystem> será parte del lanzamiento de Clang 6.0. (Nos perdimos 5.0)

  • Ya veo, gracias 🙂 ¿Pero no debería poder incluir ?

    – snoato

    7 de marzo de 2017 a las 7:59

  • La velocidad a la que Apple envía los cambios de libc ++ en sentido ascendente no depende de mí. Libc++ enviado por primera vez <experimental/filesystem> en 3.9, pero Apple aún no lo ha lanzado como parte de XCode. Si desea crear su propia versión de libc ++ desde el baúl, tendrá <experimental/filesystem>.

    – EricWF

    7 de marzo de 2017 a las 9:01


  • Incluido <experimental/filesystem> obtiene las declaraciones, pero para obtener las definiciones también debe vincularse con -lstdc++fs (para libstdc++) o I don't know (para libc++). Si alguien sabe, ¿tal vez podrían actualizar esta respuesta?

    – Quuxplusone

    7 sep 2017 a las 22:34

  • Es una pena que el sistema de archivos todavía no se pueda usar porque falta Xcode y boost también pierde algunas características de la especificación (las conversiones de charset u8string, por ejemplo). Todo lo que podemos hacer es esperar xcode 9.1 o posterior

    – Lotario

    21 de septiembre de 2017 a las 2:00

  • Acabo de instalar Xcode 9.2 y todavía no <experimental/filesystem> 🙁

    – Rodolfo Bundulis

    15 de diciembre de 2017 a las 18:31

avatar de usuario
brad allred

Xcode 11 Beta ahora incluye <filesystem>. A diferencia de las otras respuestas que indican soporte beta en Xcode 10, Apple ha mencionado esto en el Notas de lanzamiento.

También se menciona en las notas de la versión, si esto solo es compatible con iOS 13, macOS 10.15, watchOS 6 y tvOS 13. Solo podrá usar std::filesystem para proyectos destinados a estas versiones o posteriores.

  • ¿Es posible que sea compatible SOLO en las últimas versiones del sistema operativo y esté relacionado con Xcode 11 en Beta? Eso parecería inviable si tuviera la intención de admitir MacOS 10.12 a 10.14. ¿No hay también compatibilidad con Boost integrada en versiones anteriores de MacOS? ¿Quizás el pensamiento es que llamamos a todos simplemente usar Boost.Filesystem antes de 10.15?

    – SM Greenfield

    04/06/2019 a las 18:31


  • @SMGreenfield mi sospecha es que libc++ en las versiones de macOS anteriores a 10.15 carecen por completo de la implementación del sistema de archivos. Si tuviera que vincular estáticamente libc++ su posible podría ejecutar su aplicación en sistemas más antiguos (pero podría haber otros problemas al hacerlo dependiendo de la implementación). AFIK boost no se envía con macOS, pero no hay nada que le impida construir/enviar con él.

    –Brad Allred

    04/06/2019 a las 20:03

  • Estoy en Xcode versión 11.2.1 (11B500) y no hay filesystem.

    – Yo. Antonov

    20 de noviembre de 2019 a las 6:26

  • @I.Antonov Te aseguro que existe; lo he estado usando Asegúrese de habilitar el modo c++17 en su proyecto. Es posible que también deba cambiar su SDK a una de las versiones enumeradas en mi respuesta.

    –Brad Allred

    20 de noviembre de 2019 a las 6:38


  • @BradAllred Hola, fui a Configuración de compilación y luego seleccioné C++17[-std=c++17] desde el C++ Language Dialect y sigue igual.

    – Yo. Antonov

    20 de noviembre de 2019 a las 7:50

En respuesta a Max Raskin: Instalé Xcode 10 Beta 4, desde el 17 de julio de 2018, y esta versión no tiene “#include ” o “#include “.

los Notas de lanzamiento tampoco mencione libc++17 . Las notas de lanzamiento hacer mencionar que los siguientes están en Xcode 10: , y .

El ejemplo incluye la ubicación del archivo:

/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/experimental

avatar de usuario
bfx

EDITAR

Como se menciona en otra respuesta <filesystem> está disponible en Xcode 11 Beta según el Notas de lanzamiento:

Clang ahora es compatible con C ++ 17 <filesystem> biblioteca para iOS 13, macOS 10.15, watchOS 6 y tvOS 13. (50988273)

¡Aquí está la esperanza de que esté destinado a quedarse esta vez!

RESPUESTA ANTIGUA

Acabo de comprobar Xcode 10.2 Beta 4 y tiene regular <filesystem>! Para los curiosos, está en /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/.

EDITAR:

Descargado Xcode 10.2 (10E125) aaaay… <filesystem> se ha ido de nuevo No se menciona nada en el Notas de lanzamiento. Si tiene una versión de Xcode que contiene <filesystem> tumbado (como el Beta 4 que mencioné anteriormente) copiar el archivo parece funcionar bien:

$ sudo cp /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/filesystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/

Eso sí, por supuesto, cada actualización de Xcode muy probablemente romperá esta solución y hará necesaria otra copia. También, probablemente haya una buena razón por la que la implementación beta no se incluyó en el lanzamiento. Proceda con precaución…

Incluir te da las declaraciones, pero para obtener las definiciones también tienes que enlazar con -lstdc++fs (para libstdc++) o no sé (para libc++). Si alguien sabe, ¿tal vez podrían actualizar esta respuesta?

Para libc ++ necesita vincular con -lc++experimental

Si alguien todavía está interesado, Xcode 10 Beta se envía con libc ++ que tiene un sistema de archivos/experimental

ACTUALIZAR una de las versiones beta de Xcode 10 solía enviarse con él, quizás por accidente, desafortunadamente Xcode 10.1 no lo tiene 🙁

avatar de usuario
parsa

Instalé XCode 9.4 – no <filesystem>

Pero Homebrew vino al rescate con LLVM 6

brew update
brew install llvm

Y con un cambio en PATHEstaba lejos.

  • ¿Cuál fue ese cambio en PATH?

    – Miguel B.

    19 de agosto de 2021 a las 15:26

¿Ha sido útil esta solución?