【问题标题】:Clang++ updated, can't find certain headers despite them being in the include directoryClang++ 已更新,尽管它们位于包含目录中,但仍找不到某些标头
【发布时间】:2020-08-02 21:14:40
【问题描述】:

所以我在 mac 上并想试验最新的 llvm 版本,而不必等待它们通过 xcode 命令行工具传递。

所以我从他们的下载页面下载了 LLVM 10 版本的预构建二进制文件,并将其保存在一个名为 llvm 的文件夹中。因此可以在 ~/SDKs/LLVM/bin 中找到 clang 可执行文件。

我制作了这个程序:

#include <string>
#include <iostream>

int main(int argc, char const *argv[])
{
    std::string myString("Hello World");
    std::cout << myString;
    return 0;
}

然后运行:

~/SDKs/Clang+LLVM10/bin/clang++ main.cpp

我收到这个致命错误:

~/SDKs/Clang+LLVM10/bin/../include/c++/v1/string.h:60:15: fatal error: 
      'string.h' file not found
#include_next <string.h>
              ^~~~~~~~~~

这没有意义,因为我可以使用 finder 手动找到 string.h,它就在错误中引用的文件夹中。

我猜这与 clang++ 搜索我的系统包含路径有关,在那里找到较旧的 string.h,因此选择不使用更新的 string.h,导致错误?


如果有帮助,请提供一些附加信息:

运行这个(新的编译器)

~/Programming/SDKs/Clang+LLVM10/bin/clang++ -Wp,-v -E -xc -x c++ /dev/null

给我:

clang -cc1 version 10.0.0 based upon LLVM 10.0.0 default target x86_64-apple-darwin18.7.0
ignoring nonexistent directory "/usr/include/c++/v1"
ignoring nonexistent directory "/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 ~/SDKs/Clang+LLVM10/bin/../include/c++/v1
 /usr/local/include
 ~/SDKs/Clang+LLVM10/lib/clang/10.0.0/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 393 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2

正在运行(这是我的 mac 自带的默认编译器)

clang++ -Wp,-v -E -xc -x c++ /dev/null

给我

clang -cc1 version 11.0.0 (clang-1100.0.33.17) default target x86_64-apple-darwin18.7.0
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1"
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include"
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.0/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 374 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2

【问题讨论】:

  • 编译器找到头文件~/SDKs/Clang+LLVM10/bin/../include/c++/v1/string.h就好了,当该文件执行#include_next &lt;string.h&gt;(注意它不是标准的#include指令)时,它找不到所谓的其他@ 987654331@头文件。
  • 感谢您的评论,我该如何解决这个错误?

标签: c++ clang++ include-path c++-standard-library multiple-inclusions


【解决方案1】:

我也遇到了这个错误。经过一番挖掘,我找到了原因: include_next 是一个 gnu 编译器扩展,似乎它在 clang 中不存在。虽然 clang(/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++) 已经打包了目录下的原始std lib: “ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/”,但作为Apple Mac的编译源代码,一般总是通过选项“-isysroot”指定系统根路径”,一般命令是这样的:“-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk” , 覆盖默认的 std lib 搜索路径。 所以也许你必须覆盖默认的 sys root 以确保正确的 std lib 被链接。

【讨论】:

  • 是的,我自己也解决了这个问题。我会将此标记为未来用户的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2019-09-26
相关资源
最近更新 更多