No se puede compilar un programa C en una Mac después de actualizar a Catalina 10.15
xcode macos (7)
TL; DR
Parece que Apple considera
/usr/include
como algo que ha seguido el camino del dodo, está extinto, o tal vez es como el
Parrot
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.
Tanto
/usr/bin/gcc
como
/usr/bin/clang
encontrarán las bibliotecas del sistema en cuatro niveles de directorio a continuación:
/Applications/Xcode.app/Contents/Developer/Platforms/…
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 restableció
/usr/include
o el directorio bajo
/Library
.
Uno de los otros consejos en la pregunta anterior fue ejecutar:
xcode-select --install
Al hacerlo, afirmó que descargó las utilidades de línea de comandos y se aseguró de que
/usr/bin/gcc
y
/usr/bin/clang
etc. estuvieran presentes.
Ese es un paso útil (aunque definitivamente no verifiqué si estaban presentes antes).
$ /usr/bin/gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
$
Usando
/usr/bin/gcc
, ahora es posible compilar programas:
$ make CC=/usr/bin/gcc al
co RCS/al.c,v al.c
RCS/al.c,v --> al.c
revision 1.7
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN -DHAVE_GETDELIM -o al al.c -L/Users/jleffler/lib/64 -ljl
$
Sin embargo,
/usr/include
todavía falta.
Hay un directorio en
/Library
ahora:
$ ls /Library/Developer
CommandLineTools PrivateFrameworks
$ ls /Library/Developer/CommandLineTools
Library SDKs usr
$ ls /Library/Developer/CommandLineTools/SDKs
MacOSX.sdk MacOSX10.14.sdk MacOSX10.15.sdk
$ ls /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/
Entitlements.plist SDKSettings.json System
Library SDKSettings.plist usr
$
Ni el
System
ni el directorio de la
Library
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.
Por lo tanto, la probabilidad es (AFAICS, después de solo una o dos horas de esfuerzo) de que Apple ya no sea compatible con
/usr/include
, aunque todavía tiene un
/usr/lib
completamente cargado (aunque no
/lib
).
Es hora de verificar otra compilación con la opción GCC
-v
agregada (en el archivo MAKE que utilicé, al configurar
UFLAGS
agrega la opción a la línea de comando del compilador C):
$ make UFLAGS=-v CC=/usr/bin/gcc ww
co RCS/ww.c,v ww.c
RCS/ww.c,v --> ww.c
revision 4.9
done
/usr/bin/gcc -I/Users/jleffler/inc -g -O3 -std=c11 -pedantic -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith -Wold-style-definition -Wcast-qual -Wstrict-prototypes -DHAVE_MEMMEM -DHAVE_STRNDUP -DHAVE_STRNLEN -DHAVE_GETDELIM -v -o ww ww.c -L/Users/jleffler/lib/64 -ljl
Apple clang version 11.0.0 (clang-1100.0.33.8)
Target: x86_64-apple-darwin19.0.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.15.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ww.c -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=10.15 -target-cpu penryn -dwarf-column-info -debug-info-kind=standalone -dwarf-version=4 -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 512.4 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I /Users/jleffler/inc -D HAVE_MEMMEM -D HAVE_STRNDUP -D HAVE_STRNLEN -D HAVE_GETDELIM -I/usr/local/include -O3 -Wall -Wextra -Werror -Wshadow -Wmissing-prototypes -Wpointer-arith -Wold-style-definition -Wcast-qual -Wstrict-prototypes -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -Wno-extra-semi-stmt -Wno-quoted-include-in-framework-header -pedantic -std=c11 -fdebug-compilation-dir /Users/jleffler/src/cmd -ferror-limit 19 -fmessage-length 110 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=macosx-10.15.0 -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -o /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -x c ww.c
clang -cc1 version 11.0.0 (clang-1100.0.33.8) default target x86_64-apple-darwin19.0.0
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
/Users/jleffler/inc
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -lto_library /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libLTO.dylib -dynamic -arch x86_64 -macosx_version_min 10.15.0 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -o ww -L/Users/jleffler/lib/64 /var/folders/77/zx9nk6dn7_dg4xd4stvt42v00000gn/T/ww-4cb85b.o -ljl -L/usr/local/lib -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/lib/darwin/libclang_rt.osx.a
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil" -o ww.dSYM ww
$
La información clave en esa tormenta de datos es:
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Ese es efectivamente el directorio ''raíz'' para la compilación, por lo que debe haber subdirectorios debajo de eso para
usr
y
usr/include
:
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Entitlements.plist SDKSettings.json System
Library SDKSettings.plist usr
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr
bin include lib libexec share
$ ls /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
AppleTextureEncoder.h dns_util.h memory.h simd
AssertMacros.h dtrace.h menu.h slapi-plugin.h
Availability.h editline miscfs spawn.h
AvailabilityInternal.h err.h module.modulemap sqlite3.h
AvailabilityMacros.h errno.h monetary.h sqlite3ext.h
AvailabilityVersions.h eti.h monitor.h stab.h
…lots more lines…
dirent.h mach-o security xcselect.h
disktab.h mach_debug semaphore.h xlocale
dispatch machine servers xlocale.h
dlfcn.h malloc setjmp.h xpc
dns.h math.h sgtty.h zconf.h
dns_sd.h membership.h signal.h zlib.h
$
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 directorio
/usr/local/
parece estar intacto;
la advertencia sobre
usr/local/include
no existe bajo
-isysrootdir
es inofensiva (y no es visible sin la opción
-v
).
Hay una pregunta previa 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 directorio
/usr/include
ha quedado 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 directorio
/usr/include
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 archivo
.pkg
para abrir).
¿Hay una buena forma (oficial) de crear y completar el directorio
/usr/include
?
Antes de continuar, asegúrese de instalar las herramientas de línea de comandos de xcode.
xcode-select --install
En realidad, puedes hacerlo! En realidad, todos los encabezados C se encuentran aquí en esta carpeta:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
Solo necesitamos crear un enlace simbólico para todos los archivos de encabezados en esta carpeta:
/usr/local/include/
¡Funcionó para mí! La siguiente línea de comando se ocupará de todos los problemas:
sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/
Recibirás alguna advertencia. Algunos de los encabezados ya existen, como este:
ln: /usr/local/include//tcl.h: File exists
ln: /usr/local/include//tclDecls.h: File exists
ln: /usr/local/include//tclPlatDecls.h: File exists
ln: /usr/local/include//tclTomMath.h: File exists
ln: /usr/local/include//tclTomMathDecls.h: File exists
ln: /usr/local/include//tk.h: File exists
ln: /usr/local/include//tkDecls.h: File exists
ln: /usr/local/include//tkPlatDecls.h: File exists
totalmente bien ignorarlo. eso es todo.
En mi caso, parecía tener
llvm
y
gcc
también instalados usando homebrew.
Cuando los eliminé y, por lo tanto, confié completamente en el clang de macOS, pude encontrar los encabezados y la compilación funcionó nuevamente.
Establezca las siguientes variables de
Make
implícitas para señalar dónde se encuentran ahora los encabezados para las herramientas de línea de comandos de Xcode (Xcode CLI):
export CFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
La
opción
-isysroot
actualiza la ubicación de los archivos raíz lejos del directorio raíz del sistema
/
.
Por lo tanto, esto garantiza que los archivos comunes
/usr/*
se encuentren en su nuevo lugar.
Es decir, ahora se encuentran los archivos en
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
.
Estos archivos son:
Entitlements.plist
Library
SDKSettings.json
SDKSettings.plist
System
usr
La dependencia de apue.h todavía faltaba en mi
/usr/local/include
después de seguir la respuesta de
Komol Nath Roy
en esta pregunta.
Descargué la dependencia manualmente desde git y la coloqué en
/usr/local/include
Para mí, agregar la siguiente ruta a
CPATH
resolvió el problema:
export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
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
xcode-select --install
y luego cambie las banderas a Var como @Coatless sugirió:
export CFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CCFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CXXFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
export CPPFLAGS=-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk