MacOS no puede compilar c / cpp usando clang construido a partir del código fuente: error fatal: no se encontró el archivo 'stdio.h'

Compile el programa C usando el compilador c (clang) que viene con macOS

  1. La cadena de herramientas del compilador de c que viene con macOS es LLVM / Clang, no gcc. Si compara /usr/bin/gccy /usr/bin/clangcontinúa , ls -lencontrará que los dos son del mismo tamaño. De hecho, porque gcc es solo un alias de clang bajo el último macOS (13+).
  2. Si clangdesea utilizar el sistema, primero debe instalar el SDK. Para decirlo sin rodeos, debe instalar xcode yxcode-select --install

¿Dónde está el archivo de encabezado c / cpp?

  1. Si descarga una versión específica de llvm / clang en el sitio web oficial y la utiliza, el clang compilado no compilará el programa c normal, fatal error: 'stdio.h' file not foundy tales problemas ocurrirán .
  2. En términos generales, cuando ve un error de este tipo y se da cuenta de que no se puede encontrar el archivo de encabezado, ¿dónde está ese archivo de encabezado? Y no es tan común en las distribuciones de Linux /usr/includedebajo de ella?
  3. A través del clang incorporado, puede ver dónde busca el compilador normalmente compilado los archivos de encabezado durante la compilación y la vinculación (idea de prueba de diferencias), y clang -x c -E - -v < /dev/nullver a través de la línea de comandos
    • -x c, -x c++Trate la entrada como un archivo de lenguaje C y trate la entrada como C ++
    • -E, Ejecutar solo el preprocesamiento (¿qué es el preprocesamiento? Expande intuitivamente los archivos de encabezado y las macros)
    • -, Una sola línea horizontal indica salida a stdout (salida estándar)
    • </dev/null, archivo especial para Unix, que indica un agujero sin fondo, como entrada aquí
  4. Al observar el sonido del sistema y la versión específica del sonido compilada por usted mismo, encontrará la diferencia
    • ignoring nonexistent directoryInformación a tener en cuenta
    • La conclusión es que los archivos de encabezado estándar de la biblioteca c / cpp no ​​están en/usr/include
    • Se dice que en /usr/local/includela próxima, no es correcto, ya que el ls /usr/local/include | grep stdiohallazgo no quería archivo
  5. El archivo de encabezado está realmente en el SDK, por lo que primero debexcode-select --install
    • Presta atención #include <...> search starts here:a la información ahora mismo

Entonces, si usa el clang compilado del código fuente para compilar el programa C, ¿cómo debe resolver el problema del archivo de encabezado?

  1. Opciones más:-isysroot `xcrun--show-sdk-path`
    • Tales como:clang -isysroot `xcrun--show-sdk-path` hello.c -o hello
    • Ejecutar solo xcrun --show-sdk-pathencontrará una salida de ruta, y puede adivinar la ruta del SDK de un vistazo (siempre que la use xcode-select --install)

C ++ es igual, así que no entraré en detalles aquí.

Fuente de inspiración: http://lists.llvm.org/pipermail/llvm-dev/2016-July/102044.html

Supongo que te gusta

Origin www.cnblogs.com/LittleSec/p/12757964.html
Recomendado
Clasificación