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

У меня clang 3.9 от https://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 Files\LLVM\bin

И 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 ++.

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

фатальная ошибка: строковый файл не найден

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

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

РЕДАКТИРОВАТЬ: Из комментария на этой странице: https://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?

См. также:  stable / airflow подключить внешнюю базу данных PostgreSQL
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Konrad

    После установки более старой версии, построенной с использованием 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.

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

  2. Konrad

    Правильнее всего это …

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

    Или, если вам нужен 64-битный вывод …

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

    Clang определит расположение заголовков и библиотек по вашему пути. Убедитесь, что на вашем пути есть только та версия 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:\Users\burito>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:\Users\burito>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 Files\LLVM\bin
    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 Files\LLVM\lib\clang\5.0.0\include
    End of search list.
    hello.c:1:10: fatal error: 'stdio.h' file not found
    #include <stdio.h>
             ^~~~~~~~~
    1 error generated.
    
    C:\Users\burito>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 Files\LLVM\bin
     "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 Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32/sys-root/mingw/include"
    #include "..." search starts here:
    #include <...> search starts here:
     C:\Program Files\LLVM\lib\clang\5.0.0\include
     C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32\include
     C:\Program Files\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev0\mingw64\include
    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:\Users\burito>hello
    Hello World!
    
    C:\Users\burito>
    

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

    Это как использовать заголовки MinGW-w64. Если mingw установлен и находится в вашем пути, целевой параметр — это то, как заставить clang использовать заголовки, просто убедитесь, что вы выбрали правильную битовую версию для установленного mingw. person Konrad; 09.11.2017

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

    Интересно, что ваш ответ правильный и простой !. person Konrad; 09.11.2017

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

    Имейте в виду, что если у вас установлена ​​Visual Studio, Clang по умолчанию будет использовать заголовки Microsoft, если не указан целевой параметр. person Konrad; 30.03.2018

    clang принимает только аргументы стиля gcc. Возможно, вы думаете о clang-cl, том, который принимает аргументы в стиле msvc. person Konrad; 20.08.2018

    Я думаю, что в Windows в официальных двоичных файлах clang и clang-cl абсолютно одинаковы. Между прочим, когда вы говорите, что Clang будет определять расположение заголовков и библиотек по вашему пути .. Что он ожидает увидеть на пути? person Konrad; 08.10.2019

    Не совсем. clang — это капля на замену gcc, с теми же аргументами и выводом объектных файлов COFF (по умолчанию gcc). clang-cl, однако, представляет собой каплю на замену компилятору Microsoft Visual C ++, принимая те же аргументы и выводя объектные файлы MS-COFF (по умолчанию VC ++, которые, конечно, несовместимы с файлами COFF), за исключением того, что он также поддерживает C (Visual C ++ — это не компилятор C, это компилятор C ++, который принимает некоторые варианты поведения C). В остальном, я считаю, что это один и тот же компилятор. person Konrad; 31.10.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: