LLVM/Clang не удается найти

#c #clang #llvm #clang

Вопрос:

Мое окружение:

  • Система: Windows 10
  • LLVM: 12.0.0 (предварительно построенный) с clang 12.0.0 (posix)
  • MinGW-W64: 4.3.4 (предварительно встроенный) с gcc 7.3.0 (posix)

Оба MinGW-W64 и LLVM добавлены в мой ПУТЬ.
Когда я пытаюсь скомпилировать свой Приветственный мир с помощью clang , он кричит:

 clang  : warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found]
test1.cpp:4:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
 

Когда я добавляю -v , он не выполняет поиск в g stdlib:

 clang version 12.0.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: D:.llvm12bin
clang  : warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found]
clang  : warning: argument unused during compilation: '-stdlib=libc  ' [-Wunused-command-line-argument]
 "D:\.llvm12\bin\clang  .exe" -cc1 -triple x86_64-pc-windows-msvc19.11.0 -emit-obj -mrelax-all -mincremental-linker-compatible --mrelax-relocations -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test1.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -v -resource-dir "D:\.llvm12\lib\clang\12.0.0" -internal-isystem "D:\.llvm12\lib\clang\12.0.0\include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 10.0/VC/include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 9.0/VC/include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 8/VC/include" -internal-isystem "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include" -fdeprecated-macro -fdebug-compilation-dir "D:\.tmp" -ferror-limit 19 -fmessage-length=120 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.11 -std=c  14 -fdelayed-template-parsing -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -o "C:\Users\lenovo\AppData\Local\Temp\test1-4517aa.o" -x c   test1.cpp
clang -cc1 version 12.0.0 based upon LLVM 12.0.0 default target x86_64-pc-windows-msvc
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 10.0/VC/include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 9.0/VC/include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 8/VC/include"
ignoring nonexistent directory "C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include"
#include "..." search starts here:
#include <...> search starts here:
 D:.llvm12libclang12.0.0include
End of search list.
test1.cpp:4:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
 

Я установил неправильную версию LLVM или MinGW-W64?

Правка 1:
Я пытаюсь использовать --target=x86_64-w64-windows-gnu для компиляции явно неправильный фрагмент кода:

 // test3.cpp
#include <iostream>
int main() {
    cout << "n";
    return 0;
}
 

Тогда это дает мне удовлетворительный ответ:

 test3.cpp:4:2: error: use of undeclared identifier 'cout'; did you mean 'std::cout'?
        cout << "n";
        ^~~~
        std::cout
D:.mingw64libgccx86_64-w64-mingw327.3.0includec  iostream:61:18: note: 'std::cout' declared here
  extern ostream cout;          /// Linked to standard output
                 ^
1 error generated.
 

Я хочу добавить --target=x86_64-w64-windows-gnu к своим настройкам по умолчанию. Как я могу это сделать?

Ответ №1:

В Windows Clang по умолчанию работает в режиме, совместимом с MSVC, используя свою стандартную библиотеку и различные заголовки.

Чтобы заставить его работать в режиме, совместимом с MinGW, добавьте следующий флаг: --target=x86_64-w64-windows-gnu . Или, если вы компилируете для x32 бит вместо x64, замените x86_64 на i686 .

В качестве альтернативы удалите Clang (а также MinGW) и переустановите их с MSYS2. Их сборка Clang использует этот флаг по умолчанию. Кроме того, версия GCC, которую они предоставляют, более свежая, чем ваша (10.3 против 7.3).

Кроме того, судя по -stdlib=libc тому , что вы пытаетесь использовать libc в Windows. Я не думаю, что официальная сборка Clang предоставляет ее для Windows, но люди MSYS2 делают это.

Комментарии:

1. Я пробовал и stdlib=libc то, и другое с помощью MSYS2, но результат один и тот же.

2. c // test3.cpp #include <iostream> int main() { cout << "n"; return 0; } Чтобы проверить ваше решение, я попытался скомпилировать этот код , полный ошибок --target=x86_64-w64-windows-gnu , и я удовлетворен его ответом: « test3.cpp:4:2: ошибка: использование необъявленного идентификатора «cout»; вы имели в виду «std::cout»? cout < «`

3. @TeddyLi Хорошо, просто делай, что там написано? Заменить cout на std::cout ?

4. Конечно, я это знаю. Я просто хочу добавить --target=x86_64-w64-windows-gnu в свои настройки по умолчанию. Я новичок в stackoverflow, так что простите меня за то, что я испортил формат.

5. @TeddyLi Ах, хорошо. Если вы компилируете непосредственно из консоли, вам нужно каждый раз указывать флаг. Если вы используете какую-то среду разработки или систему сборки, вы можете просто поместить туда флаг. Или, как я уже сказал, вы можете переустановить компилятор из MSYS2 и установить этот флаг по умолчанию.