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


64

升级到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

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

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


您无需/usr/include将Apple的开发人员工具与Apple当前的Xcode一起使用。标头等位于中Xcode.app/Contents/Developer/Platforms/SomePlatform/SDKs/SomeSDK。(为了支持多个目标平台,必须将标题保留在不同的目录中,并且最好不要/usr/include确保在目标版本不同于主机系统时,没有编译意外地使用该文件中的文件。)xcode-select -p路径显示了什么活动的开发者目录?
埃里克·波斯特皮希尔

我在Mojave上构建了GCC 9.2.0,它希望能够/usr/include用于系统头文件。我想仍然可以使用它,尽管我怀疑Apple最终放弃了与旧版Unix系统的兼容性的最后痕迹(在某种程度上,有关编写M​​ojave'work所需要的系统的文字尚待完善。 ')。在这种情况下,我可能必须重新构建GCC,以某种方式指定系统头文件的当前位置-手动设置如何配置GCC。
乔纳森·莱夫勒

1
@JonathanLeffler:更新到catalina之后,我还面临以下问题:缺少一些文件(例如stdlib.h),这些文件在安装R软件包时由R软件包使用。我为macOS_10.14尝试了与您相同的操作,但这不再可能。GCC,c ++或/ Library / Developer / CommandLineTools / usr / bin中已安装的任何软件,但R不知道。我能做什么?
sebastiann

自大约一周前升级到Catalina以来,我就成了新Mac键盘上臭名昭著的“双重键入”问题的受害者,我改用zsh,改变主意并决定改用bash并升级到bash5.0,现在我在这里,因为我无法编译bash5.0。我想知道对这个问题的正确答案是否只是减少损失并改用Arch?
DryLabRebel

解决该问题的一种方法是使用Xcode编译器-如果已安装Xcode编译器,则它们知道在哪里可以找到系统头文件。公认的答案中的CPATH技术似乎也可以正常工作。在Mac上,我还没有遭受过“双重键入”(据我所知)的困扰。我已经让iPhone决定输入各种有趣的东西,但是到目前为止,触摸木头,我的MacBook Pro还是可以的。
乔纳森·莱夫勒

Answers:


30

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

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

我尝试添加CPATH;但是,我仍然遇到同样的错误。只是试图做一个简单的提示<<“你好”;
乔恩·佩兰特

1
当我尝试此操作时,它在Mojave下使用现在的Xcode 11.1构建的GCC 9.2.0进行了偶然测试,非常感谢。
乔纳森·莱夫勒

这对我来说适用于GCC 9.2.0_1
Sandeep,

5
如果您使用命令行工具而不是Xcode.app,请使用export CPATH=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/
nalzok,

奇怪的是 -我启动了一些代码,但#include <stdlib.h>随后编译失败,抱怨如下: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);-但是,当我添加#include <ctype.h>之前#include <stdlib.h>,它可以编译。仍在弄清楚这意味着什么以及如何自动处理它。
乔纳森·莱夫勒

48

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

xcode-select --install

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

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/

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

/usr/local/include/

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

sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

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

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

完全可以忽略。就这样。


1
是的,我想这是可能的-谢谢您的建议。它确实不符合我对“系统卫生”的要求(例如那些重复的标头),并且/usr/local/目录层次结构用于本地软件而非系统软件。海事组织,标题应该放在/usr/include,苹果只是一个痛苦。
乔纳森·莱夫勒

1
有一种解决方法,可能有效,您可以尝试。在恢复模式下,禁用SIP,然后/在写入模式下安装。然后填充/usr/include文件夹。这是因为在10.15中,系统以只读模式挂载。在不禁用SIP的情况下,您将无法挂载系统卷。
罗伊,

@KomolNathRoy:谢谢您的提示。这对我很好。我最终可以在统计软件R中安装所有需要的软件包,因为没有R能够找到安装所需的一切。
sebastiann

7
这个解决方案对我来说适用于Catalina 10.15
Matthew Barbara

2
禁用SIP对我来说是不可接受的,即使是临时措施。
乔纳森·莱夫勒

22

TL; DR

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

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

/Applications/Xcode.app/Contents/Developer/Platforms/…

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

探索

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

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

xcode-select --install

这样做时,它声称它下载的命令行工具,并确保/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
$

使用/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
$

但是,/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
$

无论是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
$

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

-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk

这实际上是编译的“根”目录,因此,在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
$

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

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


对不起,无法按照您的建议。我在catalina更新中遇到了相同的错误。使用vscode,我无法构建C ++应用程序,并且wchar.h找不到错误。我尝试包括此文件夹-I / Applications / Xcode.app / Contents / Developer / Platforms / MacOSX.platform / Developer / SDKs / MacOSX.sdk / usr / include,并且iam遇到其他错误,例如关于“错误:没有成员的符号丢失”在全局命名空间中被命名为“ isless””
user3279954

--verbose在任务文件中启用,并注意到vs代码正在查看的/usr/include/c++/v1/文件夹现在在catalina中已不存在。以及上面的sdk include一起添加了以下文件夹,现在可以使用了。“ -I / Library / Developer / CommandLineTools / usr / include / c ++ / v1 /”,
user3279954

@trojanfoe —我更喜欢SCCS,但是在1999年之后,尚不清楚SCCS是否可以在Y2K之后正常运行(而且我所知道的SCCS并没有一个很好的开源实现),所以我很不情愿地改用RCS。
乔纳森·莱夫勒

哇:D那么/usr/include失踪到底有什么问题呢?它始终是编译器包含路径的隐含部分,因此用户无需了解它(除了在尝试查找声明的位置时)。Clang在其SDK路径下执行相同的操作,Xcode.app因此净效果相同。
trojanfoe

1
@trojanfoe:/usr/includeAWOL 出现的一个问题(我的主要问题)是,如果您从源代码构建了自己的GCC,则可能是为了找到系统头/usr/include而对其进行了编译,因此编译失败。我想使用最新的GCC和Clang。我很高兴使用Apple的Clang,但我不高兴使用伪装成GCC的Apple的Clang -与GCC不同。我还没有制定出重新放置系统头文件来构建GCC的方法。(我认为--with-native-system-header-dir="${XCODE_HDR}"这是答案的一部分;但是,并不是全部答案。)
乔纳森·莱夫勒

7

设置以下隐式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

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

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

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

Entitlements.plist 
Library
SDKSettings.json
SDKSettings.plist
System
usr

在我的makefile(和我看到的大多数其他makefile)中,CFLAGS它比一个选项复杂得多-该-isysroot选项需要“附加”其他设置(很多其他设置)。这里可能有一个想法的核心(通过-isysroot选项和下的位置/Library/Developer/…),但是在准备黄金时间之前需要进行一些抛光。
乔纳森·莱夫勒

@JonathanLeffler使用export CFLAGS+=-isysroot ...该方法将适用于该用例。这是唯一对我有用的解决方案(在Mojave(10.14)和Catalina(10.15)SDK上。.pkg即使我的XCode和命令行工具是最新的,我也没有所有人都在谈论的文件)。
Norswap

@Norswap — CFLAGS=…和的使用之间存在巨大差异CFLAGS+=…
乔纳森·莱夫勒

@JonathanLeffler同意。我已经更新了使用的答案+=。谢谢@Norswap。
外套

1
另外,我发现设置SDKROOT为相同的sdk值(/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk)对我也同样适用!
Norswap

4

我是OSX中使用R的C ++编译器的新手,并且遇到了同样的问题,即OS更新后C ++找不到标头(尽管那里缺少math.h)。我遵循了https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/上的说明, 但没有任何变化。

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

xcode-select --install

然后按照@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

1

在我来说,我似乎有llvmgcc使用自制软件也安装。当我删除这些文件,从而完全依靠macOS叮当声时,它可以找到标头,并且编译再次起作用。


0

/usr/local/include在遵循此问题的Komol Nath Roy回答后,我仍然缺少apue.h依赖项。

我从git手动下载了依赖项并将其放入 /usr/local/include


该头文件apue.h来自W Richard Stevens,《 Unix环境中的 Stephen A Rago 高级编程》, 2013 年33日。AFAIK,Apple从未将其作为系统头文件提供。(它不在/usr/include我的计算机上,仍在运行Mojave。)如果将它安装在中/usr/include,则可能是手动创建的,而不是由Apple提供的。因此,它应该以前已安装/usr/local/include
乔纳森·莱夫勒

对不起我的幼稚问题,但是本周我刚接触C ++。是否在C ++中手动管理依赖项/标头?如果是的话,我应该把所有所说的依赖性/标题放在/usr/include
马修·芭芭拉

1
问题1:或多或少。这取决于您的意思,但是如果标头不是正在使用的计算机上的标准标头,则必须担心C或C ++的依赖项和标头。然后是一个问题-什么是标准?可以给出的最佳答案是“取决于”,它取决于很多因素,包括“平台”(O / S,编译器)。Q2是“不,您通常不应该在其中放任何东西/usr/include”- /usr/local/include改用。一般来说,它是最安全的离开/usr/include/usr/lib孤独,并添加下料/usr/local代替。
乔纳森·莱夫勒

0

解决方案比我想象的简单。安装clang / llvm。

brew install llvm

然后,我们需要自己创建符号链接。

for f in /usr/local/Cellar/llvm/9.0.0_1/bin/clang*; do ln -s ${f} /usr/local/bin/"${f##*/}"; done

ln -s /usr/local/Cellar/llvm/9.0.0_1/include/c++ /usr/local/include/c++

根据您的llvm版本,修改以上命令。

现在,您可以编译C ++程序而无需传递任何自定义标志。

clang++ hello.cpp


0

对我来说,它的工作原理如下:

1. xcode-select --install

2. sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

3. export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.