c - 升级到Mojave后,无法在Mac上编译C程序

标签 c macos gcc terminal

我在终端上使用gcc命令编译C程序,但是突然,在更新了Mac的操作系统(Mac OS 10.14mojave和xcode10.0)之后,我开始收到消息:

test.c:8:10: fatal error: stdio.h: No such file or directory
#include <stdio.h>
         ^~~~~~~~~
compilation terminated.

我已经安装了gcc,因为我可以在/usr/local/bin中找到它,其中确实有一个gcc。我试着在我的另一个iMac上运行相同的文件,结果没有任何问题。
我试着运行xcode-select --install并且它已经安装好了,因此它没有解决我现在遇到的问题。我猜路径是混乱的,因为在我开始从其他资源复制和粘贴一些命令来解决这个问题之后,它似乎找不到gcc
希望能帮上忙。

最佳答案

TL;博士
确保已下载最新的“命令行工具”包,并从终端(命令行)运行此包:

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

有关Catalina的一些信息,请参见Can't compile a C program on a Mac after upgrading to Catalina 10.15
从相当广泛的评论中提取一个半连贯的答案…
序言
通常,xcode-select --install是正确的解决方案,但这次似乎没有帮助。你试过运行主Xcode图形用户界面吗?它可能会为你安装一些额外的软件并清理。我是在安装了Xcode 10.0之后做的,但一周或更久以前,早在升级到Mojave之前。
我注意到,如果您的GCC安装在/usr/local/bin中,那么您可能没有使用Xcode中的GCC;它通常安装在/usr/bin中。
我也更新了macOS 10.14 Mojave和Xcode 10.0。但是,系统/usr/bin/gcc和系统/usr/bin/clang都对我有效(Apple LLVM version 10.0.0 (clang-1000.11.45.2) Target: x86_64-apple-darwin18.0.0对两者都有效)。我的国产GCC 8.2.0在/usr/include中找不到标题有问题,这与您的/usr/local/bin/gcc也找不到标题的问题是平行的。
我做了一些比较,我的Mojave机器根本没有/usr/include,但是/usr/bin/clang能够编译好。头(_stdio.h,带前导下划线)在我以前的/usr/include中;现在丢失了(因此我在GCC 8.2.0中遇到了问题)。我运行了xcode-select --install,它说“xcode-select: note: install requested for command line developer tools”,然后运行了一个GUI安装程序,它向我展示了一个我同意的许可证,它下载并安装了命令行工具——或者它声称的那样。
然后我运行Xcode GUI(command space,Xcode,return),它说需要安装更多的软件,但仍然没有。但是我可以用/usr/include/usr/bin/clang进行编译,而且/usr/bin/gcc选项表明它们正在使用
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

工作溶液
然后Maxxxnoted
我找到办法了。如果我们使用的是Xcode 10,您会注意到,如果您导航到Finder中的-v,您将不再看到名为“include”的文件夹,这就是为什么终端会抱怨“include”文件夹中缺少头文件的原因。在Xcode 10.0 Release Notes中,它显示有一个包:
/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg 

您应该安装该软件包以安装/usr文件夹。那你该走了。
当所有其他操作失败时,请阅读手册,或者在本例中阅读发行说明。当我发现苹果想要抛弃他们的Unix传统时,我并不感到惊讶,但我很失望。如果他们小心的话,他们会把我赶走的。谢谢你提供的信息。
在命令行中使用下面的命令安装了包之后,我再次安装了/usr/include,我的GCC 8.2.0再次工作。
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

下载命令行工具
正如Vesal在一篇有价值的comment文章中指出的,您需要在Mojave 10.14上下载xcode10.1的命令行工具包,您可以从以下站点下载:
https://developer.apple.com/download/more/
您需要使用苹果ID登录才能获得下载。下载完成后,安装命令行工具包。然后按照“工作解决方案”一节中的说明安装头文件。
这对我的莫哈韦10.14.1有效。我以前一定下载过这个,但我在回答这个问题时忘了。
升级至Mojave 10.14.4和Xcode 10.2
大约在2019年5月17日,我更新了Mojave 10.14.4,Xcode 10.2命令行工具也升级了(或Xcode 10.1命令行工具升级到10.2)。上面显示的/usr/include命令修复了丢失的头。将主Xcode升级到10.2,然后重新安装命令行工具和头文件包,可能还会有一些冒险。
升级至Xcode 10.3(用于Mojave 10.14.6)
在2019年7月22日,我通过应用商店得到通知,Xcode 10.3的升级是可用的,它包括iOS 12.4、tvOS 12.4、watchOS 5.3和macOS Mojave 10.14.6的SDK。我把它安装在我的10.14.5机器上,运行它,并按照它的建议安装了额外的组件,它似乎保持了open的完整性。
同一天晚些时候,我发现macOS Mojave 10.14.6也可用(系统首选项⟶软件更新),还有一个命令行实用程序包IIRC(它是自动下载和安装的)。安装o/s更新再一次清除了/usr/include,但应答顶部的/usr/include命令再次恢复了它。我在open命令文件上的日期是2019-07-15。
升级至XCode 11.0(用于Catalina 10.15)
XCode 11.0的升级(包括iOS 13、tvOS 13、watchOS 6和macOS Catalina 10.15的Swift 5.1和SDK)于2019年9月21日发布。我收到了“可用更新”的通知,并通过AppStore应用程序(更新选项卡)将其下载并安装到运行macOS Mojave 10.14.6的计算机上,没有问题,也不必使用open。安装之后(在运行应用程序之前),我立即尝试重新编译,被告知:
同意Xcode/iOS许可证需要管理员权限,请运行“sudo xcodebuild-license”,然后重试此命令。
运行这个(/usr/include)允许我运行编译器。从那时起,我运行应用程序来安装它需要的额外组件;仍然没有问题。当我升级到Catalina的时候会发生什么事情还有待观察——但是我的macOS Mojave 10.14.6机器目前都还可以(2019-09-24)。

关于c - 升级到Mojave后,无法在Mac上编译C程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935387/

相关文章:

c - GCC 编译器 - 代码块和 Mac OSX (XCode) 之间的潜在差异?

c - gcc 模块大小限制

c - 是否可以将一个预处理器的输入用于 C 中的另一个预处理器?

c++ - 取消套接字轮询操作

gcc - 启用GCC-Arm-None-EABI中的浮点仿真

c++ - 未正确定义字节序宏

c - 使用 getchar() 时出现意外输入

objective-c - NSWindow 可恢复并不总是有效

用于 Mac 应用程序的 Facebook API

c++ - 具有 64 位基础整数的枚举