¿Por qué falta /usr/include? Tengo instalado Xcode y Command Line Tools (Mojave)

Acabo de actualizar a Mojave desde High Sierra e instalé Xcode más sus herramientas de línea de comandos y herramientas adicionales. Nada se compilará desde la terminal, ¡todo dice que falta /usr/include!

¡Revisé y faltan TODOS los directorios relacionados con Dev en /usr!

¿Alguna idea de cómo arreglarlo?

Respuestas (3)

Agregue el -isysrootindicador a sus indicadores de compilación para incluir automáticamente el directorio de encabezado del SDK adecuado y evitar la necesidad del /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkgpaquete que "en una versión futura,... ya no se proporcionará".

Ejemplos:

-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk

o

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk

Puede usar xcrun --show-sdk-pathpara encontrar la ruta SDK predeterminada.

También puede usar las versiones /usr/bin/ instaladas de Xcode o CommandLineTools de clang, clang++, cc, c++, gcc, g++, que son shims que llaman para invocar la herramienta correcta xcruncon el SDK actual e incluir directorios. El valor predeterminado es CommandLineTools si lo tiene instalado.

Puede cambiar el comportamiento para usar Xcode:

$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

o cambiar de nuevo:

$ sudo xcode-select -s /Library/Developer

También puede usar -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdksi solo desea usar el valor predeterminado. Sin embargo, en la mayoría de los casos, probablemente deba investigar por qué el compilador de C que está usando no detecta los indicadores correctos (probablemente debería estar usando clangdesde el SDK en lugar de lo que sea que esté usando).

Debe ejecutar otro paso después de instalar las herramientas de línea de comandos:

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

¿Por qué? Apple ha introducido un nuevo baile de herramientas de compilación: las inclusiones del sistema ahora solo se mantienen en la ruta de un SDK específico con Xcode 10 en adelante :

El paquete de herramientas de línea de comandos instala los encabezados del sistema macOS dentro del SDK de macOS. El software que se compila con las herramientas instaladas buscará encabezados dentro del SDK de macOS [...] proporcionado por Xcode [...] o las herramientas de línea de comandos [...] dependiendo de cuál se seleccione usando xcode-select.

[...]

Las herramientas de la línea de comandos buscarán en el SDK los encabezados del sistema de forma predeterminada. Sin embargo, es posible que algún software no se compile correctamente con el SDK y requiera que los encabezados de macOS se instalen en el sistema base en/usr/include [énfasis agregado]. Si usted es el mantenedor de dicho software, lo alentamos a que actualice su proyecto para que funcione con el SDK o presente un informe de error para los problemas que le impiden hacerlo. Como solución alternativa, se proporciona un paquete adicional que instalará los encabezados en el sistema base. En una versión futura, este paquete ya no se proporcionará. Puedes encontrar este paquete en:/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Para asegurarse de que está utilizando la versión deseada de las herramientas de la línea de comandos, ejecute xcode-select -s <path to Xcode>o xcode select -s /Library/Developer/CommandLineToolsdespués de la instalación.

Nicholas Smith: ¿Cómo te enteraste de esto?
¡¿Ni siquiera tengo un directorio de Paquetes?!
Lo vi en StackOverflow en algún momento y se me quedó grabado en la cabeza.
Probablemente necesite las herramientas de línea de comandos antes de intentar esto. Ver esta respuesta .
Es posible que deba usar sudopara que este comando funcione
Si haces esto, solo estás postergando lo inevitable. Apple no proporcionará ni siquiera el paquete de compatibilidad en la próxima versión. Acostúmbrate a no tener /usr/include ahora. No lo necesitas.
Esto ya no funciona con Xcode 11.

El "por qué" se debe a que Apple ha desaprobado tener un /usr/include distinto del SDK. No debe confiar en tenerlo en el futuro.

Los compiladores ya saben que deben encontrar sus inclusiones dentro del SDK, por lo que ya no hay una necesidad real del directorio /usr/include. Puede encontrar el directorio de instalación del SDK para los archivos de inclusión usandoxcrun --show-sdk-path

¿Está esto documentado en alguna parte?
Excepto por el hecho de que macOS está (fue) certificado por unix04.
Cumplir con la especificación única de Unix o POSIX no requiere que /usr/include esté presente en el sistema de archivos.
Y sí, está documentado en la documentación del SDK.
los compiladores pueden saberlo, pero ¿qué hay de varias herramientas de configuración, por ejemplo, autoconf. Muchas de las macros de autoconf están escritas asumiendo que hay algo significativo en /usr, creo. Por ejemplo, ¿seguiría funcionando AC_CHECK_HEADER?
Bueno, MacPorts parece estar funcionando bien, aunque la mayoría de los paquetes usan autoconf. Tuvimos menos de cinco paquetes rotos de muchos miles.
@DimaPasechnik No, a la mayoría de las macros de Autoconf no les importa /usr/include, y no deberían hacerlo: lo que importa es que los compiladores puedan encontrarlas, no dónde están. Es por eso que las macros de Autoconf no buscan encabezados en el sistema de archivos, sino que compilan archivos de prueba que los incluyen.
@akim: muchas macros en el archivo Autoconf buscan cosas en /opt, etc. Cf. por ejemplo, gnu.org/software/autoconf-archive/… (ver zlib_places="/usr/local /usr /opt/local /sw"allí)
@DimaPasechnik Esta macro está mal escrita. No debe buscar el archivo, debe verificar que el include funcione. Dije "la mayoría" :-)
¿Podría sugerir cómo se puede mejorar?
Documentación de @Mark Re: este cambio/problema se menciona en las notas de la versión de Xcode 10 : "Sin embargo, es posible que algún software no se compile correctamente con el SDK y requiera que los encabezados de macOS se instalen en el sistema base en /usr/include. [. ..] Como solución alternativa, se proporciona un paquete adicional que instalará los encabezados en el sistema base". Tenga en cuenta que la solución SOLO funciona para las herramientas de línea de comandos.
@Anon deberías editar esa información en la respuesta