从 macOS Catalina 上的源代码编译 LLVM(如何解决“stdio.h”未找到)

Posted

技术标签:

【中文标题】从 macOS Catalina 上的源代码编译 LLVM(如何解决“stdio.h”未找到)【英文标题】:Compile LLVM from sources on macOS Catalina (How to solve "stdio.h" not found) 【发布时间】:2020-10-12 19:49:42 【问题描述】:

我提请您注意我解决了几天的问题,但没有一个问题可以为我解决,希望它可以节省其他人的时间。

我尝试从 macOS Catalina (10.15) 上的源代码编译 LLVM。

为此,我使用了以下命令(在遵循 LLVM 构建手册之后):

git clone https://github.com/llvm/llvm-project
cd llvm-project
mkdir build && cd build
cmake -G "Ninja" -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DCMAKE_BUILD_TYPE="Debug" ../llvm
ninja

现在您应该在 build/bin 下拥有一个可以工作的 clang 编译器。 但是,鉴于 /tmp/program.c 的内容如下:

#include <stdio.h>

int main() 
    printf("Hello, world!\n");
    return 0;

我得到以下输出:

/tmp/program.c:1:10:致命错误:找不到“stdio.h”文件
#include 
         ^~~~~~~~~
生成 1 个错误。```

我尝试了很多解决方案,包括设置“CPATH”、“CFLAGS”、“CXXFLAGS”、“LDFLAGS”等,但都没有奏效。

【问题讨论】:

【参考方案1】:

系统头文件新路径

自 macOS Catalina 以来,/usr 文件夹被挂载为只读目录,因此即使作为 root - 没有人有权修改此文件夹(好吧,除非您以 SIP 模式重新启动,这显然不是相当大的解决方案)。 整个工具链默认保存在/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk 下。您可以通过执行xcrun --show-sdk-path 来获取您的路径。我假设您在我的回答中确实有默认路径,但请根据需要进行调整。

收集信息

使用-v 标志运行clang 给了我以下信息:

./clang /tmp/program.c -v --    
clang version 11.0.0 (https://github.com/llvm/llvm-project 01641197ee0bd3895c756c925723c8c8e03bcb09)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: ~/llvm/llvm-project/build/bin/.
 "~/llvm/llvm-project/build/bin/clang-11" -cc1 -triple x86_64-apple-macosx10.15.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all -disable-free -main-file-name program.c -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-rounding-math -munwind-tables -fcompatibility-qualified-id-block-type-checking -target-cpu penryn -dwarf-column-info -debugger-tuning=lldb -target-linker-version 556.6 -v -resource-dir ~/llvm/llvm-project/build/lib/clang/11.0.0 -internal-isystem /usr/local/include -internal-isystem ~/llvm/llvm-project/build/lib/clang/11.0.0/include -internal-externc-isystem /usr/include -fdebug-compilation-dir ~/llvm/llvm-project/build/bin -ferror-limit 19 -stack-protector 1 -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fmax-type-align=16 -fcolor-diagnostics -o /var/folders/64/6bf82c_52ws1n4cwc376znvr0000gn/T/program-d111a4.o -x c /tmp/program.c
clang -cc1 version 11.0.0 based upon LLVM 11.0.0git default target x86_64-apple-darwin19.5.0
ignoring nonexistent directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 ~/llvm/llvm-project/build/lib/clang/11.0.0/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
/tmp/program.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~
1 error generated.

这可以告诉我们系统头文件的包含路径是:

/usr/local/include
~/llvm/llvm-project/build/lib/clang/11.0.0/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)

因此,我们可以看到新标头 (/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk) 的位置没有出现在这里,因此出现了错误。

我们可以做一个从/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/local/include 的符号链接,但这会产生冲突的标头并产生不好的副作用(是的,我试过了。是的,这很愚蠢......)。

解决方案

我们可以看到默认搜索头路径之一出现在构建目录下(~/llvm/llvm-project/build/lib/clang/11.0.0/include)。将标准标头符号链接到此目录不会产生任何危险的冲突。

因此,解决此问题所需要做的就是:

ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/* ~/llvm/llvm-project/build/lib/clang/11.0

我希望我的回答能帮助其他在这个问题上苦苦挣扎的人。

【讨论】:

【参考方案2】:

为了能够在 macOS 上使用从 LLVM 源编译的clang,您可以执行以下操作:

设置PATH,包含新建的clang所在的bin目录。 新的clang 需要知道XCode SDK 的位置。您可以通过设置SDKROOT 环境变量来做到这一点。例如:
 SDKROOT=`xcrun --show-sdk-path` clang test.c

应该是这样的。

【讨论】:

以上是关于从 macOS Catalina 上的源代码编译 LLVM(如何解决“stdio.h”未找到)的主要内容,如果未能解决你的问题,请参考以下文章

macOS Catalina 上的 Node-sass 无法正常工作。我应该如何解决这个问题?

macOS Catalina 上的 RODBC

macOS Catalina 上的颤振“设备不支持无线同步”错误

直观对比:macOS Big Sur较Catalina迎来了多大程度上的UI设计改进?

macOS Catalina 上的应用程序“无法打开,因为无法验证其完整性”

MacOs Catalina “无法打开,因为无法验证开发者”