No se puede compilar un programa C en una Mac después de actualizar a Catalina 10.15




xcode macos (5)

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.


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


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






macos-catalina