从 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 上的颤振“设备不支持无线同步”错误
直观对比:macOS Big Sur较Catalina迎来了多大程度上的UI设计改进?