如何在 macOS 上找到 C 头文件 errno.h 的位置?

Int*_*rer 3 c macos errno header-files macos-catalina

我是 C 语言的新手,正在尝试查看头文件的源代码errno.h

我怎样才能:

  1. 找出头文件在我的计算机上的存储位置?
  2. 查看头文件的来源?

我试过的

根据这个答案gcc --print-file-name=errno.h在我的$HOME目录中运行只会输出errno.h.

这个答案,运行cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3输出:

clang: error: no such file or directory: '/usr/include/errno.h'
clang: error: no input files
Run Code Online (Sandbox Code Playgroud)

这个答案,运行clang -E /usr/include/errno.h输出:

clang: error: no such file or directory: '/usr/include/errno.h'
clang: error: no input files
Run Code Online (Sandbox Code Playgroud)

我知道有效的一种解决方案是 running sudo find / -name "errno*.h" -type f。但是,这会返回许多结果。我想知道是否有某种编程方式可以使用 C 相关工具(例如通过调用gcc)来查找源代码。

我的电脑

  • macOS 版本:10.15.7 (Catalina)
  • clang --version --> Apple clang version 12.0.0 (clang-1200.0.32.27)

Bre*_*ale 6

不完全清楚您在这里尝试做什么 - 因为<errno.h>是标准库头文件,您可以在以下位置找到它:/usr/include/errno.h ...编辑 - 我现在可以看到您在 Catalina 上的问题。见下文:

至少在我的(较旧的)OSX 机器上,这个标题的信息量不是很大 -<sys/errno.h>反过来,它至少提供了符号常量:(EPERM, ENOENT, ...请参阅:man intro概述)

由于<sys/errno.h>它本身包含更多的系统头文件,尽管这些头文件很少涉及用户空间开发,您可以大致了解编译器如何使用预处理阶段递归地找到这些头文件:

clang -E /usr/include/errno.h- 这也适用gcc


对于Catalina,标头现在位于 SDK 下。我确信这是有原因的 - 多个 SDK(例如,iphone 开发等),以及一些防止创建/usr/include目录的安全性的事后理由。在任何情况下,对于 Catalina,您都需要 Xcode 工具:(xcrun请参阅:)man xcrun来查找 SDK 路径:.../usr/include

`xcrun --show-sdk-path`/usr/include
Run Code Online (Sandbox Code Playgroud)

提供路径,以便查看<errno.h>

less `xcrun --show-sdk-path`/usr/include/errno.h
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用以下命令运行预处理器:

clang -E `xcrun --show-sdk-path`/usr/include/errno.h
Run Code Online (Sandbox Code Playgroud)