Как использовать clang с заголовками mingw-w64 в Windows

#windows #gcc #clang #mingw #llvm

#Windows #gcc #clang #mingw #llvm

Вопрос:

У меня есть clang 3.9 из http://llvm.org/releases/3.9.0/LLVM-3.9.0-win32.exe

 clang version 3.9.0 (branches/release_39)
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: C:Program FilesLLVMbin
  

И gcc 6.2.0 (Mingw-w64)

 gcc (i686-posix-dwarf-rev1, Built by MinGW-W64 project) 6.2.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  

На моем ПК не установлен MSVC и нет Windows SDK. Мне нужна какая-то особая функция clang, и я хотел заменить ее на gcc и, более конкретно, на g , потому что я использую C .

Когда я пытаюсь скомпилировать простой файл, я получаю:

неустранимая ошибка: файл ‘string’ не найден

Означает ли это, что моя текущая установка clang не поддерживает mingw в Windows? По сути, все, что я хочу, это использовать заголовки и библиотеки из моей установки mingw-w64. Я искал решение и ничего не нашел. Я не знаю, что мне делать.

Означает ли это также, что моя установка clang зависит от MSVC, которого у меня нет?

Редактировать:Из комментария на этой странице: http://blog .johannesmp.com/2015/09/01/installing-clang-on-windows-pt2 /

Это больше не работает с последними двоичными файлами (3.7.1, 3.8, 3.9) из LLVM, потому что они были скомпилированы с Visual Studio и для Visual Studio.

Вы можете установить полную версию Visual Studio 2015 (занимает около 8 ГБ) или установить «Microsoft Visual C Build Tools 2015 Update 3», которая содержит только инструменты командной строки из VS плюс стандартные заголовочные файлы C , необходимые Clang.

Я думаю, это все объясняет. Означает ли это, что мне нужна сборка mingw, чтобы заставить ее работать с mingw?

Ответ №1:

Правильная вещь, которую нужно сделать, это…

 clang -target i686-pc-windows-gnu test.c -otest.exe
  

Или, если вы хотите 64-битный вывод…

 clang -target x86_64-pc-windows-gnu test.c -otest.exe
  

Clang определит расположение заголовков и библиотек по вашему пути. Убедитесь, что в вашем path указана только та версия Mingw, на которую вы нацелены.

По умолчанию текущая версия Clang (на данный момент 5.0.0) будет нацелена на x86_64-pc-windows-msvc

В качестве примера…

 Microsoft Windows [Version 10.0.16299.19]
(c) 2017 Microsoft Corporation. All rights reserved.

C:Usersburito>copy con hello.c
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello World!n");
    return 0;
}
^Z
        1 file(s) copied.

C:Usersburito>clang hello.c -ohello.exe --verbose
clang version 5.0.0 (tags/RELEASE_500/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:Program FilesLLVMbin
clang.exe: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found]
 "C:\Program Files\LLVM\bin\clang.exe" -cc1 -triple x86_64-pc-windows-    msvc18.0.0 -emit-obj -mrelax-all -mincremental-linker-compatible -disable-free -    disable-llvm-verifier -discard-value-names -main-file-name hello.c -mrelocation-    model pic -pic-level 2 -mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -momit-leaf-frame-pointer -v -dwarf-column-info -debugger-tuning=gdb -resource-dir "C:\Program Files\LLVM\lib\clang\5.0.0" -internal-isystem "C:\Program Files\LLVM\lib\clang\5.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 -fdebug-compilation-dir "C:\Users\burito" -ferror-limit 19 -fmessage-length 120 -fms-extensions -fms-compatibility -fms-compatibility-version=18 -fno-threadsafe-statics -fdelayed-template-parsing -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o "C:\Users\burito\AppData\Local\Temp\hello-5c526d.o" -x c hello.c
clang -cc1 version 5.0.0 based upon LLVM 5.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:
 C:Program FilesLLVMlibclang5.0.0include
End of search list.
hello.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~
1 error generated.

C:Usersburito>clang hello.c -ohello.exe --verbose -target x86_64-pc-windows-gnu
clang version 5.0.0 (tags/RELEASE_500/final)
Target: x86_64-pc-windows-gnu
Thread model: posix
InstalledDir: C:Program FilesLLVMbin
 "C:\Program Files\LLVM\bin\clang.exe" -cc1 -triple x86_64-pc-windows-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name hello.c -mrelocation-model pic -pic-level 2 -mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -momit-leaf-frame-pointer -v -dwarf-column-info -debugger-tuning=gdb -resource-dir "C:\Program Files\LLVM\lib\clang\5.0.0" -internal-isystem "C:\Program Files\LLVM\lib\clang\5.0.0\include" -internal-isystem "C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32/sys-root/mingw/include" -internal-isystem "C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32\include" -internal-isystem "C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\include" -fdebug-compilation-dir "C:\Users\burito" -ferror-limit 19 -fmessage-length 120 -fno-use-cxa-atexit -fobjc-runtime=gcc -fdiagnostics-show-option -fcolor-diagnostics -o "C:\Users\burito\AppData\Local\Temp\hello-d88ba4.o" -x c hello.c
clang -cc1 version 5.0.0 based upon LLVM 5.0.0 default target x86_64-pc-windows-msvc
ignoring nonexistent directory "C:Program Filesmingw-w64x86_64-7.2.0-posix-seh-rt_v5-rev0mingw64x86_64-w64-mingw32/sys-root/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 C:Program FilesLLVMlibclang5.0.0include
 C:Program Filesmingw-w64x86_64-7.2.0-posix-seh-rt_v5-rev0mingw64x86_64-w64-mingw32include
 C:Program Filesmingw-w64x86_64-7.2.0-posix-seh-rt_v5-rev0mingw64include
End of search list.
 "C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\bin\ld.exe" -m i386pep -Bdynamic -o hello.exe "C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32\lib\crt2.o" "C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\lib\gcc\x86_64-w64-mingw32\7.2.0\crtbegin.o" "-LC:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\lib\gcc\x86_64-w64-mingw32\7.2.0" "-LC:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32\lib" "-LC:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\lib" "-LC:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32/sys-root/mingw/lib" "C:\Users\burito\AppData\Local\Temp\hello-d88ba4.o" -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt "C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\lib\gcc\x86_64-w64-mingw32\7.2.0\crtend.o"

C:Usersburito>hello
Hello World!

C:Usersburito>
  

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

1. Вопрос заключался в том, как использовать его с заголовками mingw-w64, а не как создавать для другой архитектуры. Некоторым людям это непонятно. Например, когда я начинал, на моем компьютере не было msvc, но я попытался создать с -msvc помощью в конце. Как вы говорите, последняя версия по умолчанию предназначена для msvc, и это было моей проблемой в то время. Не было простого способа просто выбрать вместо этого gnu с их последней версией, поэтому у меня было 3 способа — понизить версию, использовать MSYS2 или создать ее самостоятельно.

2. Вот как использовать заголовки MinGW-w64. Если установлен mingw и в вашем path целевым параметром является то, как заставить clang использовать заголовки, просто убедитесь, что вы выбрали правильную разрядную версию для установленного вами mingw.

3. Я только что протестировал, Clang 3.9.0 также имеет такое поведение.

4. Интересно, тогда ваш ответ правильный и простой !.

5. Протестируйте это с помощью clang 6.0.0 и последней версии MinGW-w64 (gcc 7.30). Приведенный выше код работает.

Ответ №2:

После установки более старой версии, созданной с помощью MinGW, то есть 3.7.0 RC3, это сработало.

Вы можете заметить разницу в версии i686-pc-windows-gnu по сравнению с i686-pc-windows-msvc.

Я думаю, что clang 3.9 тоже будет работать, если они ничего не нарушат в своем исходном коде, и если вы создадите его самостоятельно. Было бы неплохо, чтобы новейшая версия 3.9 также работала с MinGW. Я слишком ленив, чтобы пытаться создать его самостоятельно.

РЕДАКТИРОВАТЬ: для mingw тоже есть несколько пакетов https://github.com/Alexpux/MINGW-packages которые вы можете установить с помощью MSYS2, которые, похоже, обеспечивают поддержку clang. Есть некоторые коммиты, связанные с 3.8 и 3.9.

Надеюсь, это поможет кому-то, у кого похожие проблемы.