Hay una pregunta anterior No se puede compilar el programa C en una Mac después de actualizar a Mojave , y las respuestas a eso han cubierto la mayoría de las variaciones de lo que sale mal.
Ahora, a partir del lunes 2019-10-07, puede actualizar a macOS Catalina 10.15. Una vez más, durante la actualización, el /usr/include
directorio quedó impresionado por la actualización, a pesar de que XCode 11.0 se instaló antes de actualizar (desde Mojave 10.14.6) a Catalina. En consecuencia, los compiladores creados para esperar que haya un /usr/include
directorio ya no funcionan.
El principal paso recomendado para los problemas de Mojave: usar el comando:
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
no funciona fuera de la puerta porque el directorio /Library/Developer/CommandLineTools/Packages/
no existe (por lo que todavía no hay un .pkg
archivo para abrir).
¿Hay una buena forma (oficial) de crear y completar el directorio /usr/include
?
/usr/include
usar las herramientas de desarrollador de Apple con el Xcode actual de Apple. Los encabezados y tal están enXcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK
. (Mantener encabezados en diferentes directorios es necesario para admitir múltiples plataformas de destino, y es bueno no/usr/include
asegurarse de que ninguna compilación use accidentalmente archivos de este cuando se dirige a una versión diferente del sistema host). ¿Quéxcode-select -p
muestra la ruta a el directorio de desarrollador activo?/usr/include
para los encabezados del sistema. Todavía me gustaría poder usar eso, aunque sospecho que Apple finalmente ha desechado los últimos vestigios de compatibilidad con los sistemas Unix heredados (hasta cierto punto, la escritura estaba en la pared con el sistema requerido para que Mojave funcionara) '). En ese caso, probablemente tenga que reconstruir GCC especificando la ubicación actual de los encabezados del sistema de alguna manera: ataque manual sobre cómo configurar GCC.Respuestas:
Para mí, agregar la siguiente ruta para
CPATH
resolver el problema:fuente
export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
#include <stdlib.h>
y luego no se pudo compilar quejándose de:In file included from …/usr/include/sys/wait.h:110, —— from …/usr/include/stdlib.h:66, —— from bm.c:27: —— …/usr/include/sys/resource.h:443:9: error: no previous prototype for ‘getiopolicy_np’ [-Werror=missing-prototypes] —— 443 | int getiopolicy_np(int, int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
—— Sin embargo, cuando agrego#include <ctype.h>
antes#include <stdlib.h>
, se compila OK. Todavía estoy resolviendo lo que esto significa y cómo manejarlo automáticamente.Antes de continuar, asegúrese de instalar las herramientas de línea de comandos de xcode.
En realidad, puedes hacerlo! En realidad, todos los encabezados C se encuentran aquí en esta carpeta:
Solo necesitamos crear un enlace simbólico para todos los archivos de encabezados en esta carpeta:
¡Funcionó para mí! La siguiente línea de comando se ocupará de todos los problemas:
Recibirás alguna advertencia. Algunos de los encabezados ya existen, como este:
totalmente bien ignorarlo. eso es todo.
fuente
/usr/local/
jerarquía de directorios está destinada al software local en lugar del software del sistema. En mi opinión, los encabezados deberían estar/usr/include
y Apple solo está siendo un dolor./
modo de escritura. Luego, complete la/usr/include
carpeta. Es porque en 10.15, el sistema se monta como modo de solo lectura. sin deshabilitar el SIP, no podrá montar el volumen del sistema.TL; DR
Parece que Apple lo considera
/usr/include
como algo que ha seguido el camino del dodo, está extinto, o tal vez es como el Parrot de Monty Python .Usar el GCC proporcionado por Apple (en realidad, es Clang con cualquier otro nombre, como lo muestra la información de la versión) o Clang evita problemas. Ambos
/usr/bin/gcc
y/usr/bin/clang
encontrarán las bibliotecas del sistema en cuatro niveles de directorio a continuación:Si crea su propio GCC u otro compilador, (probablemente) necesitará configurarlo para encontrar las bibliotecas del sistema en el directorio de la aplicación Xcode.
Exploraciones
Inmediatamente después de la actualización, ejecuté XCode 11.0. Quería instalar algunos componentes adicionales, así que lo dejé hacerlo. Sin embargo, eso no se restableció
/usr/include
o el directorio bajo/Library
.Uno de los otros consejos en la pregunta anterior fue ejecutar:
Al hacerlo, alegó que descargó las utilidades de línea de comandos, y se aseguró de que
/usr/bin/gcc
y/usr/bin/clang
etc. estaban presentes. Ese es un paso útil (aunque definitivamente no verifiqué si estaban presentes antes).Utilizando
/usr/bin/gcc
, ahora es posible compilar programas:Sin embargo,
/usr/include
todavía falta. Hay un directorio debajo/Library
ahora:Ni el
System
ni elLibrary
directorio contienen nada muy prometedor.Cuando todo lo demás falla, lea el manual
Siguiente paso: busca y lee las notas de la versión:
No hay información allí que se relacione con esto. Entonces, la probabilidad es (AFAICS, después de solo una o dos horas de esfuerzo) de que Apple ya no sea compatible
/usr/include
, aunque todavía tiene una carga completa/usr/lib
(/lib
aunque no ).Tiempo para verificar otra compilación con la opción GCC
-v
agregada (en el archivo MAKE que utilicé, la configuraciónUFLAGS
agrega la opción a la línea de comando del compilador C):La información clave en esa tormenta de datos es:
Ese es efectivamente el directorio 'raíz' para la compilación, por lo que debe haber subdirectorios debajo de eso para
usr
yusr/include
:Esto muestra que el nombre de directorio de una milla de largo y totalmente memorable contiene los encabezados estándar C y POSIX, además de los extras específicos de Apple.
El
/usr/local/
directorio anterior parece estar intacto; la advertencia sobreusr/local/include
no existir bajo el-isysrootdir
es inofensiva (y no visible sin la-v
opción).fuente
wchar.h
no encontré un error. Intenté incluir esta carpeta -I / Aplicaciones / Xcode.app / Contenidos / Desarrollador / Plataformas / MacOSX.platform / Developer / SDKs / MacOSX.sdk / usr / include e iam obteniendo otros errores como sobre símbolos faltantes para "error: ningún miembro llamado 'isless' en el espacio de nombres global "--verbose
en el archivo de tareas y noté que el código vs está mirando la/usr/include/c++/v1/
carpeta que ya no existe en catalina. También se agregó la siguiente carpeta junto con la inclusión sdk anterior y ahora funciona. "-I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /",/usr/include
desaparecer? Siempre fue parte implícita de la ruta de inclusión del compilador, por lo que el usuario nunca necesitó saberlo (aparte de cuando intentaba encontrar dónde se declaró algo). Clang hace lo mismo con su ruta SDK debajo,Xcode.app
por lo que el efecto neto es el mismo./usr/include
AWOL desaparecido es que si ha creado su propio GCC desde la fuente, probablemente se compiló para encontrar los encabezados del sistema/usr/include
y, por lo tanto, las compilaciones fallan. Quiero usar el último GCC y Clang. Estoy feliz de usar el Clang de Apple, pero no estoy feliz de usar el Clang de Apple disfrazado de GCC, no es lo mismo que GCC. Todavía no he elaborado una receta para construir GCC con los encabezados del sistema reubicados. (Creo que--with-native-system-header-dir="${XCODE_HDR}"
es parte de la respuesta; sin embargo, no es la respuesta completa)Establezca las siguientes
Make
variables implícitas para señalar dónde se encuentran ahora los encabezados para las herramientas de línea de comandos de Xcode (Xcode CLI):La
-isysroot
opción actualiza la ubicación de los archivos raíz lejos del directorio raíz del sistema/
.Por lo tanto, esto garantiza que los
/usr/*
archivos comunes se encuentren en su nuevo lugar.Es decir,
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
ahora se encuentran los archivos en . Estos archivos son:fuente
CFLAGS
es mucho más complejo que una sola opción: la-isysroot
opción debería ser 'además de' las otras configuraciones (muchas otras configuraciones). Puede haber un núcleo de una idea aquí (pase la-isysroot
opción y la ubicación debajo/Library/Developer/…
), pero necesitaría un poco de pulido antes de que esté listo para el horario estelar.export CFLAGS+=-isysroot ...
lugar funcionará para ese caso de uso. Esta es la única solución que funcionó para mí (en Mojave (10.14) con Catalina (10.15) SDK. No tengo el.pkg
archivo del que todo el mundo habla a pesar de que mi XCode y las herramientas de línea de comandos están actualizadas).CFLAGS=…
yCFLAGS+=…
.+=
. Gracias @Norswap.SDKROOT
el mismo valor de SDK (/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
) también funcionará para mí!Soy un novato con el compilador de C ++ para R en OSX y tuve el mismo problema que C ++ no pudo encontrar el encabezado después de que se actualizó el sistema operativo ( faltan math.h aunque estaba allí ). Seguí las instrucciones de https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/ pero nada cambió.
Finalmente, funcionó para mí después de reinstalar la CLI de Xcode
y luego cambie las banderas a Var como @Coatless sugirió:
fuente
En mi caso, parecía tener
llvm
ygcc
también lo instalé usando homebrew. Cuando los eliminé y, por lo tanto, me basé completamente en el clang de macOS, pude encontrar los encabezados y la compilación funcionó nuevamente.fuente
la dependencia de apue.h todavía faltaba en mi
/usr/local/include
después de seguir respuesta de Komol Nath Roy en esta pregunta.Descargué la dependencia manualmente desde git y la coloqué en
/usr/local/include
fuente
apue.h
proviene de W Richard Stevens, Stephen A Rago Advanced Programming in the Unix Environment, 3rd Edn 2013. AFAIK, Apple nunca lo proporcionó como encabezado del sistema. (No está en/usr/include
mi máquina que todavía ejecuta Mojave). Si alguna vez se instaló/usr/include
, probablemente se creó manualmente en lugar de ser proporcionado por Apple. Como tal, debería haberse instalado/usr/local/include
anteriormente./usr/include
?/usr/include
" - use/usr/local/include
en su lugar. En general, es más seguro para salir/usr/include
y/usr/lib
solo, y añadir bajo el material/usr/local
en su lugar.La solución fue más simple de lo que pensaba. Instala clang / llvm.
Entonces necesitamos crear enlaces simbólicos nosotros mismos.
Y
Dependiendo de su versión llvm, modifique los comandos anteriores.
Ahora, puede compilar programas C ++ sin pasar ningún indicador personalizado.
fuente
Intenté 1) vincular manualmente 2) brew install llvm, pero no funcionaron.
Finalmente, esto funcionó para mí: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503
Al configurar los siguientes entornos:
fuente
Para mí, funciona bien de la siguiente manera:
fuente