MacOS 上的 Clang 包含问题

gok*_*oki 2 c++ macos sdk xcode clang

我在 MacOS 上从头开始构建 Clang,但我遇到了问题。

使用以下配置 Clang 进行构建:

cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/opt/clang-12 -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86" -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi;lldb" ../llvm
Run Code Online (Sandbox Code Playgroud)

这是我的测试程序:

#include <ostream>
#include <algorithm>

int main(int argc, char** argv) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果使用 XCode 附带的 Clang 11.0.3 编译,则可以 clang++ -c test.cc

  2. 如果使用新的 Clang 12(内置),则出错 /opt/clang-12/bin/clang++ -c test.cc

In file included from test.cc:2:
In file included from /opt/clang-12/bin/../include/c++/v1/ostream:138:
In file included from /opt/clang-12/bin/../include/c++/v1/ios:214:
In file included from /opt/clang-12/bin/../include/c++/v1/iosfwd:95:
/opt/clang-12/bin/../include/c++/v1/wchar.h:119:15: fatal error: 'wchar.h' file not found
#include_next <wchar.h>
              ^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)

根据我尝试包含的内容,我会收到不同的包含错误。

? tests /opt/clang-12/bin/clang++ -v -c test.cc
clang version 12.0.0 (https://github.com/llvm/llvm-project.git b529c5270c99e0ca18e3cbd9a5f50eb0970e560a)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /opt/clang-12/bin
 (in-process)
 "/opt/clang-12/bin/clang-12" -cc1 -triple x86_64-apple-macosx10.15.0 -Wundef-prefix=TARGET_OS_ -Werror=undef-prefix -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -mrelax-all --mrelax-relocations -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test.cc -mrelocation-model pic -pic-level 2 -mframe-pointer=all -fno-rounding-math -munwind-tables -fcompatibility-qualified-id-block-type-checking -target-cpu penryn -debugger-tuning=lldb -target-linker-version 556.6 -v -resource-dir /opt/clang-12/lib/clang/12.0.0 -stdlib=libc++ -internal-isystem /opt/clang-12/bin/../include/c++/v1 -internal-isystem /usr/include/c++/v1 -internal-isystem /usr/local/include -internal-isystem /opt/clang-12/lib/clang/12.0.0/include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /Users/duddie/Projects/Audio/1voct/1voct_modular/tests -ferror-limit 19 -stack-protector 1 -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fmax-type-align=16 -fcolor-diagnostics -o test.o -x c++ test.cc
clang -cc1 version 12.0.0 based upon LLVM 12.0.0git default target x86_64-apple-darwin19.6.0
ignoring nonexistent directory "/usr/include/c++/v1"
ignoring nonexistent directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /opt/clang-12/bin/../include/c++/v1
 /usr/local/include
 /opt/clang-12/lib/clang/12.0.0/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
In file included from test.cc:2:
In file included from /opt/clang-12/bin/../include/c++/v1/ostream:138:
In file included from /opt/clang-12/bin/../include/c++/v1/ios:214:
In file included from /opt/clang-12/bin/../include/c++/v1/iosfwd:95:
/opt/clang-12/bin/../include/c++/v1/wchar.h:119:15: fatal error: 'wchar.h' file not found
#include_next <wchar.h>
              ^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)
  1. 如果 Clang 11.0.3 (XCode) 或 Clang 12 但针对 ARM,则出错 clang++ -target arm-none-eabi -c test.cc
test.cc:2:10: fatal error: 'ostream' file not found
#include <ostream>
         ^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)

任何想法我做错了什么?

小智 8

将以下内容添加到 shell 配置文件~/.bash_profile~/.zsh_profile任何其他方式来设置您正在运行它的 shell 可访问的环境变量。

export SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"
Run Code Online (Sandbox Code Playgroud)

在您的 macOS/Xcode 版本上验证 SDK 的正确路径。

重新打开终端(获取文件可能无法可靠地工作)。然后再次尝试您的编译命令。

/opt/clang-12/bin/clang++ -c test.cc
Run Code Online (Sandbox Code Playgroud)

命令行工具包在 macOS SDK 中安装 macOS 系统头文件。使用已安装工具编译的软件将在 Xcode 提供的 macOS SDK 中搜索头文件: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk 或命令行工具: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk取决于使用 xcode-select 选择哪个。默认情况下,命令行工具会在 SDK 中搜索系统标头。但是,某些软件可能无法针对 SDK 正确构建,并且需要将 macOS 头文件安装在 /usr/include 下的基本系统中。如果您是此类软件的维护者,我们鼓励您更新您的项目以使用 SDK 或针对阻止您这样做的问题提交错误报告。作为一种解决方法,提供了一个额外的包,用于将头文件安装到基本系统。在未来的版本中,将不再提供此包。您可以在以下位置找到此软件包: /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

https://developer.apple.com/documentation/xcode-release-notes/xcode-10-release-notes

  • 实际上发现是 -target arm-none-eabi 造成的。-arch arm7 可以工作 (2认同)

Nuu*_*lll 7

可能是一个更便携的(我在llvm-project/llvm/utils/lit/lit/util.py:399找到了提示):

export SDKROOT=$(xcrun --show-sdk-path --sdk macosx)
Run Code Online (Sandbox Code Playgroud)

此外,您还可以-isysroot向 clang 驱动程序添加参数来更改标头搜索的默认系统根目录:

clang++ a.cpp -isysroot $(xcrun --show-sdk-path --sdk macosx)
Run Code Online (Sandbox Code Playgroud)

更多详细信息和调查说明请参见此处