Как заставить Clang работать на Windows - PullRequest
40 голосов
/ 29 июня 2011

Я следовал следующему пошаговому руководству , и мне удалось, после некоторой путаницы, заставить clang компилироваться с использованием code: blocks и MinGW. Отлично, теперь я могу добавить модуль Clang для затмения (зачем иметь одну IDE, а четыре -) и начать компиляцию.

Я могу скомпилировать простую программу, которая не использует стандартную библиотеку, но, к сожалению, когда я пытаюсь скомпилировать это:

#include <iostream>
using namespace std;

int main()
{
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

прежде всего я получаю это:

.. \ src \ test.cpp: 9: 10: фатальная ошибка: файл 'iostream' не найден

поэтому я добавляю заголовки Mingw к пути включения; тогда я получаю это:

'фатальная ошибка: файл' bits / c ++ config.h ' не найдено '

что странно. Почему MingW работает, если этот файл не в «битах»? Это встроено в компилятор? Не берите в голову, я нахожу реализацию этого и создаю файл в 'bits /'.

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

C:\Program Files\CodeBlocks\MinGW\lib\gcc\mingw32\4.4.1\include\c++/cwchar:45:26: error: expected value in expression
#if _GLIBCXX_HAVE_WCHAR_H

и многие другие. Должно ли это быть

#if defined(_GLIBCXX_HAVE_WCHAR_H) 

или

#ifdef _GLIBCXX_HAVE_WCHAR_H?

Если это так, то стандартные библиотеки MinGW неверны.

Полагаю, я ошибочен, предполагая, что clang может быть вставлен вместо gcc и что он не предназначен для работы со стандартными библиотеками gnu. Любое подтверждение или отрицание этого, подкрепленное доказательствами, будет приветствоваться!

Итак, есть ли у кого-нибудь надежный способ компиляции clang на ПК с Windows? В Интернете не хватает информации о лязге и особенно о Windows.

Я действительно хочу, чтобы Clang и LLVM работали, поскольку они звучат великолепно из того, что я прочитал. Любая помощь будет оценена.

Спасибо.

Ответы [ 6 ]

20 голосов
/ 29 июня 2011

Есть несколько инструкций по созданию clang на этой странице (скрыто в части "Clang Development" боковой панели ...)Для MinGW вам нужен раздел под названием «О Unix-подобных системах».Единственная сложная часть - это шаг 5, в котором рассказывается, как настроить пути для стандартной библиотеки C ++.Они должны быть добавлены в код в clang/lib/Frontend/InitHeaderSearch.cpp.На моей машине это выглядело так:

// FIXME: temporary hack: hard-coded paths.
AddPath("/usr/local/include", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++/mingw32", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include/c++/backward", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../include", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include", System, true, false, false);
AddPath("c:/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/include-fixed", System, true, false, false);

, хотя я не уверен, что все это нужно!

6 голосов
/ 30 июня 2011

В зависимости от вашей версии MinGW (и, следовательно, версии портированной gcc), заголовки могут быть разбросаны немного ...

В файле clang/lib/Frontend/InitHeaderSearch.cpp вы найдете несколько жесткихпути.Проблема в том, что каждая из них зависит от версии, поэтому, если вашей версии MinGW нет, добавьте ее (и попросите включить ее в основную ветку Clang, опубликовав патч для cfe-commit).

Лично я запускаю его на MinGW / msys только с небольшими проблемами (ряд тестов проваливается, потому что моя оболочка msys искажает ввод при : в ...), хотя я не пробовал использовать его из CodeBlocks, хотя(Я привык к командной строке).

Если вы хотите помочь, Такуми следит за интеграцией MinGW, Франсуа Пише возглавляет работу над совместимостью с заголовками VC ++ / MFC (т.е. является основным участником)и @ rubenvb в настоящее время пытается установить патчи на libc ++, чтобы он работал в Windows (libc ++ еще не компилируется в Windows).Эти 3 области в значительной степени независимы и требуют различных навыков и знаний.

5 голосов
/ 14 июня 2013

У меня была похожая проблема. Я использовал аналоги GCC 4.7 путей, указанных в ответе Майка Динсдейла, и указал их с флагом '-isystem' (Clang 3.2 в дистрибутиве mingw64, собранном rubenvb) для всех моих будущих вызовов исполняемого файла clang (через скрипты). Поскольку эти каталоги явно указываются как system каталоги включения, все потенциально утомительные предупреждения, генерируемые ими, автоматически подавляются.

tl; dr: флаг -isystem указывает system каталоги включения без перекомпиляции в Clang

4 голосов
/ 29 июня 2011

Clang имеет жестко заданные местоположения поиска, как определено в файле clang/lib/Frontend/InitHeaderSearch.cpp, рядом с комментарием FIXME: temporary hack: hard-coded paths.

На этой странице есть примечание об этом: http://clang.llvm.org/get_started.html

Получите пути включения из вашего другого компилятора (MingW) и жестко закодируйте их в Clang, и это может работать. (Я не уверен, что поддержка Clang для Windows там уже на 100%)

2 голосов
/ 06 мая 2017

Windows 10 / VS 2017 / Clang 4.0.0 отсутствует stdlib.h в коде C. Вот как я это решил:

  • Открыть x86_x64 Cross Tools Command Prompt for VS 2015/2016/2017. Запуск clang здесь должен устранить ошибку «отсутствующих заголовков».
  • Если вы все еще не работаете, вам не хватает реальных заголовков и / или библиотек, поскольку Clang оставляет эти особенности платформы VS или MinGW. Перейдите на \Program Files (x86)\Windows Kits\10\Include\ и найдите в его подкаталогах (если они есть) stdlib.h и co. Если файл не найден, вам нужно установить последнюю версию Windows 10 SDK, перейдя в Visual Studio (установщик) и нажав Изменить , чтобы добавить пакеты.
0 голосов
/ 04 марта 2013

Когда у меня возникла та же проблема, я просто настроил Code Blocks на правильные каталоги включения для моей установки. И он использует -I с clang ++, и пока все отлично работает.

...