Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 10.09.2019
Сообщений: 7
1

Как заставить Clang использовать MinGW по умолчанию?

11.09.2019, 01:01. Показов 2252. Ответов 3

Приветствую, форумчане.
Я пишу на C++ в среде Windows 10 (x64). В качестве компилятора использую Clang, который в своей работе опирается на MinGW. Неудобство заключается в том, что по умолчанию Clang всё же нацелен не на MinGW, а на Visual Studio, и при каждом запуске упорно пытается отыскать в системе "a Visual Studio Installation". Не находит, поскольку VS у меня на компьютере нет и не будет, после чего отказывается компилировать без данного изделия. Приходится явно передавать в командную строку параметр --target, например вот так:
Код
clang main.cpp --target=x86_64-pc-windows-gnu -o project.exe
В приведённом примере необходимость перенацеливать Clang слегка раздрожает, но особых проблем не создаёт. Настоящее "веселье" началось позже, когда я попытался собрать одну внушительную библиотеку при помощи CMake (предварительно прописав Clang в переменных среды CC и CXX, чтобы система сборки использовала именно его для компиляции). CMake обнаружила компилятор, протестировала его и заявила, что Clang не способен скомпилировать простейшую программу. А ниже - уже знакомое мне сообщение:
clang.exe: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found]
Оно и понятно: при тестировании CMake не передавала компилятору команду перенацелиться на MinGW; Clang предсказуемо вылетел и был признан недееспособным. Никакого способа заставить CMake передавать дополнительные параметры я не нашёл (вообще-то такая возможность существует, но не на этапе проверки компилятора).
Как же заставить Clang использовать MinGW по умолчанию? В результате многодневного поиска по Интернету и собственных напряжённых размышлений, я вывел следующие варианты действий:
  1. Использовать файлы конфигурации. Можно поместить последовательность команд в текстовый файл, и при запуске компилятора они будут добавлены к стартовым параметрам (точнее, помещены перед ними). Однако требуется явно передать имя файла, а это неприемлемо по выше описанным причинам. Интуиция подсказывает, что должен существовать некий глобальный конфигурационный файл, содержимое которого Clang подключает по умолчанию, но подтверждений этому найти не удалось.
  2. Самостоятельно собрать Clang (а точнее LLVM) из исходников при помощи CMake, указав желаемую "целевую тройку" в переменной LLVM_DEFAULT_TARGET_TRIPLE. У процесса сборки есть свои подводные камни, но это - тема для отдельной ветки. Если кратко, то собирать LLVM мне не улыбается.
  3. Написать простейшую консольную программу, которая принимает на вход параметры, предназначенные для компилятора, и передаёт их Clang, добавляя --target. Решение обещает быть эффективным, но против него восстаёт моё эстетическое чувство. Придётся ведь во всех задачах подменять Clang этой утилитой. Одним словом, костыль.
Может быть существуют другие варианты решения проблемы? Или я в трёх имеющихся чего-то не учёл?
Заранее спасибо.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2019, 01:01
Ответы с готовыми решениями:

Пытаемся подружить clang 3.6 и Code::Blocks 13.12 + MinGW под Windows 7
Скачал clang. Установил в корень диска С. То есть, путь получился такой: До этого у меня уже был...

Как использовать переменных среды linux в clang программе?
Собственно, нужно что бы моя программка вывела значение переменной LOGNAME. Для баша я знаю как, а...

Как заставить кнопки отображаться стилем Win7? (MinGW)
Приветствую всех. Пишу на C++ (WinAPI). Компилятор - MinGW. Появилась следующая проблема: В...

Как заставить Twebbrowser использовать Javascript
Как заставить Twebbrowser использовать Javascript и в какой процедуре вызвать эту Javascript-функцию

3
15110 / 8110 / 1958
Регистрация: 30.01.2014
Сообщений: 13,782
11.09.2019, 09:19 2
Цитата Сообщение от Диванный критик Посмотреть сообщение
Может быть существуют другие варианты решения проблемы?
Поставить MSYS2, где уже все настроено и собрано как надо.
1
0 / 0 / 0
Регистрация: 10.09.2019
Сообщений: 7
23.09.2019, 04:12  [ТС] 3
Привет всем.
По совету DrOffset установил Msys2. Затем взял встроенный в него пакетный менеджер и поставил с его помощью Clang из официального репозитория. Для проверки написал элементарный "Hello world"
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
using namespace std;
cout << "Hello world!" << endl;
char input[16];
cin >> input;
}
и скомпилировал его командой
Bash
1
$ clang++ compiler_test.cpp -static -o test.exe
Компиляция прошла успешно: я получил исполняемый файл test.exe, который действительно печатал в консоли "Hello world!". Однако размер этого экзешника ввёл меня в ступор - он весил 2,9 мегабайта! Я провернул ту же процедуру, но без флага -static, и получил на выходе файл на 315 килобайтов. Совершенно неадекватные цифры для простейшей программы, учитывая тот факт, что на чистом Windows (без Msys2) Clang компилировал точно такой же исходный код в бинарники размером на порядок меньше.
Эксперименты с Gcc дали менее тяжёлые, но всё ещё непозволительно раздутые экзешники: 2,3 мегабайта для статического и 151 килобайт для обычного.
С одной стороны, я достиг своей цели: теперь у меня есть Clang, по умолчанию настроенный на использование MinGW. Но с другой стороны, такие размеры исполняемого файла для "Hello world" кажутся мне чем-то психиатрическим. Есть мысли, как решить эту проблему?
0
15110 / 8110 / 1958
Регистрация: 30.01.2014
Сообщений: 13,782
23.09.2019, 17:24 4
Диванный критик, Оптимизацию и стрип для начала включить.
Bash
1
clang++ -O2 compiler_test.cpp -static -s -o test.exe
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2019, 17:24

Mingw пути включаемых файлов и библиотек по умолчанию
Здравствуйте! Решил попробовать поработать с кросс-платформенным компилятором gcc в Windows. Для...

Как заставить ноутбук использовать интергрированную видеокарту?
Есть ноут Asus k401L. Соответственно у него две видеокарты: встроенная от Intel и дискретная от...

Как заставить Postgres использовать определенный индекс
Есть запрос SELECT DISTINCT &quot;Field1&quot; FROM &quot;Table&quot; WHERE &quot;Field2&quot; LIKE 'val1%' AND...

Как заставить Resident Evil 5 использовать лицензию?
Установил RESIDENT EVIL 5(лицензия),но при запуске игры,запускается другая игра которая уже стояла...

Как заставить виртмашину использовать максимум разрешения экрана
Установил ВиртБокс. На него W7. все пашет, но ... Разрешение экрана минимальное. 600*900 что ли.....

Как заставить программу использовать больше ресурсов процессора?
Возможно ли вообще, в принципе, заставить программу использовать больше ресурсов процессора? Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.