#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 и установить этот флаг по умолчанию.