当前位置: 首页 > 知识库问答 >
问题:

Clang如何找到它的默认sysroot/target三元组?(clang整洁已停止工作)

东方华晖
2023-03-14

背景:

在Windows 10 PC上,我有一个c代码库。使用CMAKE,我生成了一个Mingw-w64项目(使用Eclipse IDE)和一个Visual Studio 2017项目。我喜欢用不同的构建系统编译我的项目,因为每个系统都会给出不同的警告和错误。作为Mingw构建的一部分,我可以使用CMAKE的CXX_clang_tidy启用clang整洁检查。这工作得很好,生成了一个联合编译,显示了来自clang-tride的许多有趣的警告。

当我安装mingw-w64、llvm和VS时,我很小心地不让它们填充PATH环境变量,所以常规的命令提示符不会运行gcc、clang或CL或任何相关的工具。在启动Eclipse或Visual Studio之前,环境是由一个批处理文件设置的。

这多年来一直运行良好(我仍在使用 clang 7.0.1)。两个 IDE 编译相同的代码库就好了......

直到我升级到Visual Studio 2019,包括它自己的clang 10.0.0版本。

现在,我原来的 clang 7.0.1 已停止工作!由于我只使用 clang-tidy,因此需要一段时间才能缩小范围,但是原始 clang 正在新 clang 的包含位置中查找系统标头。它找到的标头太新,构建失败。

我发现很多东西可以在 SO 和其他地方尝试(尽管欢迎任何指针),例如提供 --sysroot 开关,所以这个问题更具体:

问题:

当没有明显的环境变量指向特定的clang位置时,clang在哪里找到它的默认目标三元组,因此它是-内部isystem路径?为什么我以前工作的clang安装现在要在最近安装的clang位置查找它的系统标头?

使用 Windows 命令提示符:

cd C:\Program Files\LLVM\bin (我的原始 clang 位置)

C:\Program Files\LLVM\bin>clang test.cpp -v
clang version 7.0.1 (tags/RELEASE_701/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
 "C:\\Program Files\\LLVM\\bin\\clang.exe" -cc1 -triple x86_64-pc-windows-msvc19.26.28806 -emit-obj -mrelax-all -mincremental-linker-compatible -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -momit-leaf-frame-pointer -v -resource-dir "C:\\Program Files\\LLVM\\lib\\clang\\7.0.1" -internal-isystem "C:\\Program Files\\LLVM\\lib\\clang\\7.0.1\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.26.28801\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\um" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\winrt" -fdeprecated-macro -fdebug-compilation-dir "C:\\Program Files\\LLVM\\bin" -ferror-limit 19 -fmessage-length 120 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.26.28806 -std=c++++14 -fdelayed-template-parsing -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o "C:\\Users\\Foo\\AppData\\Local\\Temp\\test-c0aac1.o" -x c++ test.cpp
clang -cc1 version 7.0.1 based upon LLVM 7.0.1 default target x86_64-pc-win32
#include "..." search starts here:
#include <...> search starts here:
 C:\Program Files\LLVM\lib\clang\7.0.1\include
 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include
 C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
 C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared
 C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um
 C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt
End of search list.
In file included from test.cpp:1:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include\string:9:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include\yvals_core.h:462:2: error:
      STL1000: Unexpected compiler version, expected Clang 9.0.0 or newer.
#error STL1000: Unexpected compiler version, expected Clang 9.0.0 or newer.

其中C:\Program Files(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include是今天才安装的clang10.0.0位置,因此显然没有编译为clang.exe。

clang从哪里得到它的默认值?

共有1个答案

满玉泽
2023-03-14

唯一的“基本真相”是叮当本身的代码。

由于安装了多个版本的MSVC,当初始化MSVC工具链驱动程序时,clang将使用不同的技巧来设置环境(请参阅上面链接中的< code > MSVCToolChain::MSVCToolChain()

为了解决类似的问题,我使用VCToolsInstallDir环境变量将clang指向旧的MSVC包含路径。

 类似资料:
  • 我通过以下步骤针对libc,libc abi,编译器-rt构建clang: > < li> 为了下载(和更新)llvm和子项目,我使用了以下脚本: 首先,我使用 gcc 针对 libgcc 和 libstdc 构建 llvm、clang、libunwind,并将它们安装在 / 中。在以下所有步骤中,除了最后一个,我都使用这个新鲜的叮当。 (我几乎可以肯定,这里没有一个步骤是多余的。) 在最后一步,

  • Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。 Clang 开发事出有因,Wiki 介绍如下: Apple 使用 LLVM 在不支持全部 OpenGL 特性的 GPU (Intel 低端显卡) 上生成代码 (JIT),令程序仍然能够正常运行。之后 LLV

  • 我是新来的Spring。当我运行一个Spring批处理应用程序时,我希望只看到“Hello World!”,但相反,我得到了以下附加细节-

  • 我试图显示在超文本标记语言页面绘制的交互式SVG图像。我对javascript/jQuery语言没有经验,但是使用一些jQuery插件,比如PowerTip,我目前能够在悬停在SVG元素上时显示定制的工具提示。自定义的工具提示出现,但在一秒钟后消失,当它们被默认工具提示的外观关闭时(在所有浏览器中),只显示标题元素的内容。有办法禁用默认工具提示吗?下面是我使用PowerTip显示自定义工具提示的方

  • 我有一个父pom,它为我的其他组件提供所需的版本号变量 您必须使用分类器将补充工件附加到项目中,而不是替换它们 我发现这是因为jar打包固有的maven jar插件默认绑定,但我正在进行war打包,所以在war打包之后,默认jar执行开始并抛出上面的一个。任何停止违约的解决方案都将帮助我提前感谢。

  • 对于中继中的工作正常,但对于来自中继的,失败并显示错误消息(链接): 错误:未为此 lambda 函数捕获“此” 在命名空间范围内定义对两者都适用。 使用 lambda 捕获稍微修改的定义也适用于全局或本地范围。 哪个编译器是对的?