背景:
在Windows10PC上,我有一个c++代码库。使用CMAKE,我生成一个明-W64项目(使用Eclipse )和一个VisualStudio2017项目。我喜欢用不同的构建系统编译我的项目,因为每个系统都会给出不同的警告和错误。作为明威构建的一部分,我可以使用CMAKE的CXX_CLANG_TIDY启用clang-整齐检查。这很好,产生了一个联合编译,显示了许多有趣的警告来自clang。
当我安装mingw-w64、llvm和VS时,我非常小心,不允许它们填充PATH环境变量,这样常规命令提示符就不会运行gcc、clang或CL或任何相关的工具。环境是由批处理文件在启动Eclipse或Visual之前设置的。
这已经成功多年了(我还在使用clang7.0.1)。两个IDE都编译了相同的代码库.
直到我升级到Visual 2019,包括它自己的clang10.0.0副本。
现在,我原来的clang7.0.1已经停止工作了!因为我只使用clang,所以需要一段时间才能缩小范围,但是原来的clang正在寻找新clang的包含位置中的系统标头。它发现的标头太新,构建失败。
我已经找到了许多可以尝试的东西(尽管欢迎任何指针),比如提供一个--sysroot
交换机,所以这个问题更具体:
问题:
当没有明显的环境变量指向特定的clang位置时,clang在哪里找到它的默认目标三重,因此它是-internal-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从哪里得到它的缺省值?
发布于 2021-06-22 14:38:34
唯一的“地面真相”是clang本身的代码。
安装了多个版本的MSVC后,clang将在初始化MSVC工具链驱动程序时使用不同的技巧来设置环境(参见上面链接中的MSVCToolChain::MSVCToolChain()
)。
为了解决类似的情况,我使用VCToolsInstallDir
环境变量将clang定向到旧的MSVC包含路径。
https://stackoverflow.com/questions/62414613
复制相似问题