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/includedirectorio 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/includedirectorio 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 .pkgarchivo para abrir).
¿Hay una buena forma (oficial) de crear y completar el directorio /usr/include?

/usr/includeusar 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/includeasegurarse de que ninguna compilación use accidentalmente archivos de este cuando se dirige a una versión diferente del sistema host). ¿Quéxcode-select -pmuestra la ruta a el directorio de desarrollador activo?/usr/includepara 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
CPATHresolver 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/includey Apple solo está siendo un dolor./modo de escritura. Luego, complete la/usr/includecarpeta. 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/includecomo 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/gccy/usr/bin/clangencontrará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/includeo 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/gccy/usr/bin/clangetc. 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/includetodavía falta. Hay un directorio debajo/Libraryahora:Ni el
Systemni elLibrarydirectorio 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(/libaunque no ).Tiempo para verificar otra compilación con la opción GCC
-vagregada (en el archivo MAKE que utilicé, la configuraciónUFLAGSagrega 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
usryusr/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/includeno existir bajo el-isysrootdires inofensiva (y no visible sin la-vopción).fuente
wchar.hno 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 "--verboseen 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/includedesaparecer? 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.apppor lo que el efecto neto es el mismo./usr/includeAWOL desaparecido es que si ha creado su propio GCC desde la fuente, probablemente se compiló para encontrar los encabezados del sistema/usr/includey, 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
Makevariables 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
-isysrootopció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.sdkahora se encuentran los archivos en . Estos archivos son:fuente
CFLAGSes mucho más complejo que una sola opción: la-isysrootopción debería ser 'además de' las otras configuraciones (muchas otras configuraciones). Puede haber un núcleo de una idea aquí (pase la-isysrootopció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.pkgarchivo 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.SDKROOTel 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
llvmygcctambié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/includedespués de seguir respuesta de Komol Nath Roy en esta pregunta.Descargué la dependencia manualmente desde git y la coloqué en
/usr/local/includefuente
apue.hproviene 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/includemi 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/includeanteriormente./usr/include?/usr/include" - use/usr/local/includeen su lugar. En general, es más seguro para salir/usr/includey/usr/libsolo, y añadir bajo el material/usr/localen 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