99

之前有一个问题Can't compile C program on a Mac after upgrade to Mojave,这个问题的答案已经涵盖了大多数问题的变化。

现在——从 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

4

16 回答 16

73

在继续之前,请确保安装 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

完全可以忽略。就这样。

于 2019-10-11T23:06:43.567 回答
54

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

export CPATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
于 2019-10-10T12:55:04.907 回答
34

TL;博士

似乎苹果公司认为/usr/include它已经走上了渡渡鸟的道路——它已经灭绝——或者它可能就像巨蟒的鹦鹉一样。

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

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

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

那里没有与此相关的信息。因此,Apple 不再支持的可能性是(AFAICS,仅经过一两个小时的努力)/usr/include——尽管它仍然有一个满载的/usr/lib/lib虽然没有)。

是时候检查-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

这实际上是编译的“根”目录,因此在该目录下应该有子目录 forusrusr/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选项,则不可见)。

于 2019-10-07T23:40:11.407 回答
12

将以下隐式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
于 2019-10-12T23:18:49.940 回答
6

我是 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
于 2019-10-14T16:52:15.803 回答
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'
于 2020-05-27T14:09:45.263 回答
4

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

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
于 2020-03-02T10:27:30.367 回答
4

如果您同时安装了命令行工具和 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

感谢https://stackoverflow.com/a/61526989/596599这个答案。

于 2020-12-03T03:48:09.120 回答
3

llvm就我而言,我似乎已经gcc使用自制软件安装了。当我删除这些并因此完全依赖 macOS clang 时,它可以找到标题并且编译再次工作。

于 2019-10-29T10:03:26.223 回答
2

简答

/Library/Developer/CommandLineTools/usr/bin/clang++ -o main main.cpp -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk

结果

解释

在当前的 macOS 版本中,c/c++ 标头在内部搜索/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/,而不是/usr/include. 因此,您需要使用-isysroot选项“重置”根目录。

希望这是有道理的。

于 2020-08-11T03:26:19.397 回答
1

如果使用外部 LLVM 安装,请将这些添加到您的~/.bash_profile

LLVM_PATH="/usr/local/opt/llvm/" # or any other path
LLVM_VERSION="11.0.0"
export PATH="$LLVM_PATH:$PATH"
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
export LD_LIBRARY_PATH="$LLVM_PATH/lib/:$LD_LIBRARY_PATH"
export DYLD_LIBRARY_PATH="$LLVM_PATH/lib/:$DYLD_LIBRARY_PATH"
export CPATH="$LLVM_PATH/lib/clang/$LLVM_VERSION/include/"
export LDFLAGS="-L$LLVM_PATH/lib"
export CPPFLAGS="-I$LLVM_PATH/include"
export CC="$LLVM_PATH/bin/clang"
export CXX="$LLVM_PATH/bin/clang++"

(调整clang版本和外部llvm安装路径。)

然后运行source ~/.bash_profile

于 2021-06-29T18:32:24.413 回答
0

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

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

于 2019-10-13T13:12:14.820 回答
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
于 2019-12-15T16:58:13.003 回答
0

我试过 1) 手动链接 2) brew install llvm,但它们没有用。

最后,这对我有用: https ://gitmemory.com/issue/pytorch/pytorch/31190/565153503

通过设置以下环境变量:

export CC=clang
export CXX=clang++
export MACOSX_DEPLOYMENT_TARGET=10.9
于 2020-01-03T01:55:04.443 回答
0

就我而言,我做了数百万件事,但我认为以下步骤有助于修复 ruby​​ 安装。

  1. xcode-select --install
  2. 设置这些标志
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. sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/

  2. export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

  3. rbenv install 2.6.3 -v

于 2020-09-20T15:57:15.267 回答
0

对我来说,错误是:xcrun[20873:1179298] Failed to open macho file at /Library/Developer/CommandLineTools/usr/bin/clang++ for reading: Too many levels of symbolic links

所以我打开我的终端并转到以下文件夹(如错误消息所述):/Library/Developer/CommandLineTools/usr/bin/

然后我删除了名为的快捷方式文件clang++

sudo rm clang++

接下来,我复制了一个名为的可执行文件并将clang复制的文件重命名为clang++

sudo cp clang clang++

最后它起作用了。

于 2021-06-21T06:56:12.840 回答