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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/58278260/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 10:47:43  来源:igfitidea点击:

Can't compile a C program on a Mac after upgrading to Catalina 10.15

cxcodemacosgccmacos-catalina

提问by Jonathan Leffler

There's a previous question Can't compile C program on a Mac after upgrade to Mojave, and the answers to that have covered most of the variations on what goes wrong.

之前有一个问题无法在升级到 Mojave 后在 Mac 上编译 C 程序,并且该问题的答案已经涵盖了有关出错的大部分变化。

Now — as of Monday 2019-10-07 — you can upgrade to macOS Catalina 10.15. Once again, during the upgrade, the /usr/includedirectory has been blown away by the update, even though XCode 11.0 was installed before upgrading (from Mojave 10.14.6) to Catalina. Consequently, compilers built to expect that there is a /usr/includedirectory do not work any longer.

现在——截至 2019 年 10 月 7 日星期一——您可以升级到 macOS Catalina 10.15。再一次,在升级过程中/usr/include,即使在升级(从 Mojave 10.14.6)到 Catalina 之前安装了 XCode 11.0 ,该目录也被更新吹走了。因此,构建为期望有一个/usr/include目录的编译器不再起作用。

The main recommended step for the Mojave issues — using the command:

针对 Mojave 问题的主要推荐步骤 - 使用以下命令:

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

does not work out of the gate because the directory /Library/Developer/CommandLineTools/Packages/does not exist (so there's not yet a .pkgfile to open).

因为目录/Library/Developer/CommandLineTools/Packages/不存在(所以还没有.pkg打开的文件),所以无法正常工作。

Is there a good (official) way to create and populate the directory /usr/include?

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

采纳答案by Hamid

For me adding the following path to CPATHsolved the issue:

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

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

回答by Roy

Before you proceed, make sure to install xcode command line tools.

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

xcode-select --install

Actually, you can do it! Actually all the C headers are found here in this folder:

事实上,你可以做到!实际上所有的 C 头文件都可以在这个文件夹中找到:

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

We just need to create symlink for all the headers file into this folder:

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

/usr/local/include/

It worked for me! the following command line will take care of all the problems:

它对我有用!以下命令行将处理所有问题:

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

You will get some warning. Some of the headers already exists, like this:

你会得到一些警告。一些标题已经存在,如下所示:

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

totally ok to ignore. that's all.

完全可以忽略。就这样。

回答by Jonathan Leffler

TL;DR

TL; 博士

It appears that Apple considers /usr/includeas something that has gone the way of the dodo — it is extinct — or maybe it's like Monty Python's Parrot.

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

Using the Apple-provided GCC (actually, that's Clang by any other name, as the version information shows) or Clang avoids problems. Both /usr/bin/gccand /usr/bin/clangwill find the system libraries four directory levels below:

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

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

If you build your own GCC or other compiler, you will (probably) need to configure it to find the system libraries under the Xcode application directory.

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

Explorations

探索

Immediately after the upgrade, I ran XCode 11.0. It wanted to install some extra components, so I let it do so. However, that did not reinstate /usr/includeor the directory under /Library.

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

One of the other bits of advice in the previous questionwas to run:

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

xcode-select --install
xcode-select --install

When doing so, it claimed that it downloaded the command line utilities, and it ensured that /usr/bin/gccand /usr/bin/clangetc were present. That's a useful step (though I didn't definitively check whether they were present before).

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

Using /usr/bin/gcc, it is now possible to compile programs:

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

However, /usr/includeis still missing. There is a directory under /Librarynow:

然而,/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
$

Neither the Systemnor the Librarydirectory contain anything very promising.

目录SystemLibrary目录都不包含任何非常有前途的东西。

When all else fails, read the manual

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

Next step — find and read the release notes:

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

There's no information in there that relates to this. So, the probability is (AFAICS, after only an hour or two's effort) that Apple no longer support /usr/include— though it does still have a fully-loaded /usr/lib(no /libthough).

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

Time to check another compilation with GCC option -vadded (in the makefile I used, setting UFLAGSadds the option to C compiler command line):

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

The key information in that blizzard of data is:

暴风雪中的关键信息是:

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

That's effectively the 'root' directory for the compilation, so there should be sub-directories under that for usrand usr/include:

这实际上是编译的“根”目录,因此在 for usrand下应该有子目录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
$

This shows that the mile-long and totally unmemorable directory name does contain the standard C and POSIX headers, plus Apple-specific extras.

这表明一英里长且完全无法记住的目录名称确实包含标准的 C 和 POSIX 标头,以及 Apple 特定的附加内容。

The previous /usr/local/directory appears to be intact; the warning about usr/local/includenot existing under the -isysrootdiris harmless (and not visible without the -voption).

之前的/usr/local/目录似乎完好无损;关于usr/local/include不存在于 下的警告-isysrootdir是无害的(如果没有-v选项则不可见)。

回答by coatless

Set the following implicit Makevariables to point to where the headers are now located for Xcode Command Line Tools (Xcode CLI):

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

The -isysrootoptionupdates the location of the root files away from the system root directory /.

-isysroot选项将根文件的位置更新为远离系统根目录/

So, this ensures that the common /usr/*files are found in their new place.

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

That is, the files at /Library/Developer/CommandLineTools/SDKs/MacOSX.sdkare now found. These files are:

也就是说,/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk现在找到了文件在。这些文件是:

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

回答by Nancy

I am a newbie with C++ compiler for R in OSX and I got the same issue that C++ could not find the header after OS was updated (missing math.h although it was there). I followed instructions from https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/but nothing changed.

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

Finally, it worked for me after I reinstalled the Xcode CLI

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

xcode-select --install

and then change the flags to Var as @Coatless suggested:

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

回答by frbl

In my case I seemed to have llvmand gccalso installed using homebrew. When I removed those, and thus relied fully on the macOS clang, it could find the headers and the compiling worked again.

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

回答by AlDante

On MacOS Catalina 10.15.4, with Xcode Version 11.5 (11E608c) I also needed to update the library path in my .zshrc (the MacOSX.sdk paths are new):

在 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'

回答by Salil

The solution was simpler than I thought. Install clang/llvm.

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

brew install llvm

Then we need to create symlinks ourselves.

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

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

And

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

Depending upon your llvm version, modify the above commands.

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

Now, you can compile C++ programs without passing any custom flags.

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

clang++ hello.cpp

回答by Y Liu

I tried 1) manually linking 2) brew install llvm, but they did not work.

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

Finally, this worked for me: https://gitmemory.com/issue/pytorch/pytorch/31190/565153503

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

By setting the following env vars:

通过设置以下环境变量:

export CC=clang
export CXX=clang++
export MACOSX_DEPLOYMENT_TARGET=10.9

回答by pfcstyle

For me, it works well as follow:

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

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