MacOS 上的 Clang 包含问题
Clang on MacOS having problems with its includes
我在 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
这是我的测试程序:
#include <ostream>
#include <algorithm>
int main(int argc, char** argv) {
return 0;
}
如果使用 XCode clang++ -c test.cc
附带的 Clang 11.0.3 编译,则正常
如果使用新的 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.
根据我尝试包含的内容,我会遇到不同的包含错误。
➜ 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.
- 错误,如果 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.
知道我做错了什么吗?
将以下内容添加到 shell 配置文件 ~/.bash_profile
或 ~/.zsh_profile
或任何其他方式来设置 shell 您 [=30] 可访问的环境变量=] 它在.
export SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"
在您的 macOS/Xcode 版本上验证 SDK 的正确路径。
重新打开终端(获取文件可能无法可靠地工作)。
然后再次尝试您的编译命令。
/opt/clang-12/bin/clang++ -c test.cc
The Command Line Tools package installs the macOS system headers
inside the macOS SDK. Software that compiles with the installed tools
will search for headers within the macOS SDK provided by either Xcode
at:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk
or the Command Line Tools at:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
depending on which
is selected using xcode-select. The command line tools will search the
SDK for system headers by default. However, some software may fail to
build correctly against the SDK and require macOS headers to be
installed in the base system under /usr/include. If you are the
maintainer of such software, we encourage you to update your project
to work with the SDK or file a bug report for issues that are
preventing you from doing so. As a workaround, an extra package is
provided which will install the headers to the base system. In a
future release, this package will no longer be provided. You can find
this package at:
/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
https://developer.apple.com/documentation/xcode-release-notes/xcode-10-release-notes
尽管如此,我还是能够通过以下方式解决 MacOs Big Sur 的问题
export SDKROOT='/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk'
可能更便携(我在 llvm-project/llvm/utils/lit/lit/util.py:399 找到了提示):
export SDKROOT=$(xcrun --show-sdk-path --sdk macosx)
此外,您还可以将 -isysroot
参数添加到 clang driver 以更改 header 搜索的默认系统根目录:
clang++ a.cpp -isysroot $(xcrun --show-sdk-path --sdk macosx)
更多细节和调查记录here
我在 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
这是我的测试程序:
#include <ostream>
#include <algorithm>
int main(int argc, char** argv) {
return 0;
}
如果使用 XCode
附带的 Clang 11.0.3 编译,则正常clang++ -c test.cc
如果使用新的 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.
根据我尝试包含的内容,我会遇到不同的包含错误。
➜ 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.
- 错误,如果 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.
知道我做错了什么吗?
将以下内容添加到 shell 配置文件 ~/.bash_profile
或 ~/.zsh_profile
或任何其他方式来设置 shell 您 [=30] 可访问的环境变量=] 它在.
export SDKROOT="/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk"
在您的 macOS/Xcode 版本上验证 SDK 的正确路径。
重新打开终端(获取文件可能无法可靠地工作)。 然后再次尝试您的编译命令。
/opt/clang-12/bin/clang++ -c test.cc
The Command Line Tools package installs the macOS system headers inside the macOS SDK. Software that compiles with the installed tools will search for headers within the macOS SDK provided by either Xcode at:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk
or the Command Line Tools at:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
depending on which is selected using xcode-select. The command line tools will search the SDK for system headers by default. However, some software may fail to build correctly against the SDK and require macOS headers to be installed in the base system under /usr/include. If you are the maintainer of such software, we encourage you to update your project to work with the SDK or file a bug report for issues that are preventing you from doing so. As a workaround, an extra package is provided which will install the headers to the base system. In a future release, this package will no longer be provided. You can find this package at:/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
https://developer.apple.com/documentation/xcode-release-notes/xcode-10-release-notes
尽管如此,我还是能够通过以下方式解决 MacOs Big Sur 的问题
export SDKROOT='/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk'
可能更便携(我在 llvm-project/llvm/utils/lit/lit/util.py:399 找到了提示):
export SDKROOT=$(xcrun --show-sdk-path --sdk macosx)
此外,您还可以将 -isysroot
参数添加到 clang driver 以更改 header 搜索的默认系统根目录:
clang++ a.cpp -isysroot $(xcrun --show-sdk-path --sdk macosx)
更多细节和调查记录here