Как Clang находит тройку sysroot/target по умолчанию? (clang-tidy перестала работать)

Фон:

На ПК с Windows 10 у меня есть кодовая база С++. Используя CMAKE, я создаю проект Mingw-w64 (используя Eclipse IDE) и проект Visual Studio 2017. Мне нравится компилировать мои проекты с разными системами сборки, поскольку каждая выдает разные предупреждения и ошибки. В рамках сборки Mingw я могу включить проверки аккуратности с помощью CMAKE CXX_CLANG_TIDY. Это хорошо работает, производя совместный компилятор, показывающий много интересных предупреждений от clang-tidy.

Когда я устанавливал 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 ищет системные заголовки в новом местоположении include. Заголовки, которые он находит, слишком новые, и сборка завершается ошибкой.

Я нашел много вещей, которые можно попробовать в SO и в других местах (хотя любые указатели приветствуются), например, предоставление переключателя --sysroot, поэтому этот вопрос более конкретен:

Вопрос:

Когда нет очевидных переменных среды, указывающих на конкретное местоположение clang, где clang находит свою целевую тройку по умолчанию и, следовательно, это -internal-isystem пути? Почему моя ранее работающая установка clang теперь ищет системные заголовки в недавно установленном месте clang?

С помощью командной строки Windows:

cd C:\Program Files\LLVM\bin (мое исходное местоположение лязга)

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 — место установки clang 10.0.0 только сегодня, поэтому явно не скомпилированное в clang.exe.

Откуда clang берет значения по умолчанию?


person MiloBloom    schedule 16.06.2020    source источник


Ответы (1)


Единственная наземная истина — это код самого clang.

Если установлено несколько версий MSVC, clang будет использовать разные приемы для настройки среды при инициализации драйвера набора инструментов MSVC (см. MSVCToolChain::MSVCToolChain() по ссылке выше)

Чтобы решить аналогичный случай, я использовал переменную среды VCToolsInstallDir, чтобы направить clang на старые пути включения MSVC.

person Victor K    schedule 22.06.2021