升级到Catalina 10.15后,无法在Mac上编译C程序

Jon*_*ler 38 c macos xcode gcc macos-catalina

升级到Mojave后,还有一个问题不能在Mac上编译C程序,而该问题的答案已涵盖了发生问题的大多数变体。

现在-从2019年10月7日星期一开始-您可以升级到macOS Catalina 10.15。再次,在升级过程中/usr/include,即使在从Mojave 10.14.6升级到Catalina之前安装了XCode 11.0 ,该目录也被更新所破坏。因此,编译器期望没有/usr/include目录就不再起作用。

建议的解决Mojave问题的主要步骤-使用以下命令:

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
Run Code Online (Sandbox Code Playgroud)

由于目录/Library/Developer/CommandLineTools/Packages/不存在(因此尚无.pkg要打开的文件),因此无法正常工作。

有没有一种好的(官方)方法来创建和填充目录/usr/include

Roy*_*Roy 21

在继续之前,请确保安装xcode命令行工具。

xcode-select --install
Run Code Online (Sandbox Code Playgroud)

实际上,您可以做到!实际上,所有C头文件都位于此文件夹中:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
Run Code Online (Sandbox Code Playgroud)

我们只需要为所有头文件创建符号链接到此文件夹中:

/usr/local/include/
Run Code Online (Sandbox Code Playgroud)

它为我工作!以下命令行将解决所有问题:

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/
Run Code Online (Sandbox Code Playgroud)

您会收到一些警告。某些标头已经存在,例如:

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
Run Code Online (Sandbox Code Playgroud)

完全可以忽略。就这样。

  • 此解决方案在Catalina 10.15上对我有用 (5认同)
  • 禁用 SIP 对我来说是不可接受的,即使作为临时措施也是如此。 (3认同)
  • 是的,我想这是可能的——谢谢你的建议。它并不真正符合我对“系统卫生”的要求(例如那些重复的标头),并且“/usr/local/”目录层次结构适用于本地软件而不是系统软件。IMO,标头应该位于“/usr/include”中,而苹果只是一个麻烦。 (2认同)
  • 有一个办法,可能有效,你可以尝试一下。在恢复模式下,禁用 SIP,然后在写入模式下挂载“/”。然后填充`/usr/include`文件夹。这是因为在 10.15 中,系统安装为只读模式。如果不禁用 SIP,您将无法安装系统卷。 (2认同)
  • 这是唯一有效的方法,尝试了六种指南,+1 (2认同)

小智 18

对我来说,添加以下路径可以CPATH解决此问题:

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
Run Code Online (Sandbox Code Playgroud)

  • 我尝试添加 CPATH;但是,我仍然遇到同样的错误。只是想做一个简单的 cout << "hello"; (2认同)
  • 当我尝试这个时,它在 Mojave 下使用现在的 Xcode 11.1 构建的 GCC 9.2.0 进行了休闲测试 - 谢谢。 (2认同)
  • 如果您使用的是命令行工具而不是Xcode.app,请使用`export CPATH = / Library / Developer / CommandLineTools / SDKs / MacOSX.sdk / usr / include /`。 (2认同)

Jon*_*ler 14

TL; DR

苹果似乎认为/usr/include它已经成为了渡渡鸟的方式-已经灭绝了-也许就像Monty Python的Parrot一样

使用Apple提供的GCC(实际上是Clang,任何其他名称,如版本信息所示)或Clang都可以避免问题。双方/usr/bin/gcc/usr/bin/clang会发现系统库四个以下目录层次:

/Applications/Xcode.app/Contents/Developer/Platforms/…
Run Code Online (Sandbox Code Playgroud)

如果您构建自己的GCC或其他编译器,则(可能)需要对其进行配置以在Xcode应用程序目录下找到系统库。

探索

升级后,我立即运行XCode 11.0。它想安装一些额外的组件,所以我允许这样做。但是,这并没有恢复,也没有恢复/usr/include目录下的目录/Library

一个在前面建议的其他位的问题是运行:

xcode-select --install
Run Code Online (Sandbox Code Playgroud)

这样做时,它声称它下载的命令行工具,并确保/usr/bin/gcc/usr/bin/clang等出席了会议。这是一个有用的步骤(尽管我之前没有明确检查它们是否存在)。

$ /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
$
Run Code Online (Sandbox Code Playgroud)

使用/usr/bin/gcc,现在可以编译程序:

$ 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
$
Run Code Online (Sandbox Code Playgroud)

但是,/usr/include仍然不见了。/Library现在有一个目录:

$ 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
$
Run Code Online (Sandbox Code Playgroud)

无论是System也不是Library目录包含任何前景十分看好。

当所有其他方法均失败时,请阅读手册

下一步-查找并阅读发行说明:

那里没有与此相关的信息。因此,/usr/include尽管苹果仍然拥有满载的负载/usr/lib/lib尽管如此),但(仅一两个小时的努力后,AFAICS)就不再支持。

是时候检查-v添加了GCC选项的另一个编译了(在我使用的makefile中,设置UFLAGS将选项添加到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
$
Run Code Online (Sandbox Code Playgroud)

暴风雪般的数据中的关键信息是:

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
Run Code Online (Sandbox Code Playgroud)

这实际上是编译的“根”目录,因此,在for usrusr/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
$
Run Code Online (Sandbox Code Playgroud)

这表明,这一英里长且完全难忘的目录名确实包含标准的C和POSIX标头,以及Apple特定的附加功能。

先前的/usr/local/目录似乎完整无缺;关于usr/local/include不存在的警告-isysrootdir是无害的(如果没有该-v选项,则不会显示)。


Nan*_*ncy 6

我是 OSX 中 R 的 C++ 编译器的新手,我遇到了同样的问题,即在操作系统更新后 C++ 找不到头文件(尽管 math.h 在那里,但缺少 math.h)。我按照https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/ 的说明进行操作, 但没有任何改变。

最后,在我重新安装 Xcode CLI 后它对我有用

xcode-select --install
Run Code Online (Sandbox Code Playgroud)

然后按照@Coatless 的建议将标志更改为 Var:

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
Run Code Online (Sandbox Code Playgroud)


coa*_*ess 5

将以下隐式Make变量设置为指向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
Run Code Online (Sandbox Code Playgroud)

-isysroot选项将根文件的位置从系统根目录中移开/

因此,这可确保/usr/*在新位置找到通用文件。

即,/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk现在可以找到位于的文件。这些文件是:

Entitlements.plist 
Library
SDKSettings.json
SDKSettings.plist
System
usr
Run Code Online (Sandbox Code Playgroud)

  • @JonathanLeffler 使用 `export CFLAGS+=-isysroot ...` 而适用于该用例。这是唯一对我有用的解决方案(在带有 Catalina (10.15) SDK 的 Mojave (10.14) 上。即使我的 XCode 和命令行工具是最新的,我也没有每个人都在谈论的“.pkg”文件)。 (2认同)

AlD*_*nte 5

在 MacOS Catalina 10.15.4 上,使用 Xcode 版本 11.5 (11E608c) 我还需要更新我的 .zshrc 中的库路径(MacOSX.sdk 路径是新的):

export CPATH='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include:/opt/local/include'
export LIBRARY_PATH='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib:/opt/local/lib'
Run Code Online (Sandbox Code Playgroud)


Pac*_*Sky 5

如果您同时安装了命令行工具和 XCode,请确保实际使用了命令行工具安装的 SDK:

#查看当前sdk

$ xcrun --show-sdk-path

#更改sdk

$ sudo xcode-select -s /Library/Developer/CommandLineTools #Using CommandLineTools SDK

$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer #Using XCode.app SDK

感谢/sf/answers/4306889261/的回答。