Как скомпилировать Clang на Windows - PullRequest
50 голосов
/ 24 февраля 2012

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

Я знаю о превосходных предварительно собранных версиях rubenvb clang , ноЯ хочу скомпилировать это для себя.Я также слушал доклады GoingNative о clang, в которых говорилось, что у него пока не очень хорошая поддержка Windows.Как мне заставить Clang работать в Windows?

Ответы [ 4 ]

56 голосов
/ 24 февраля 2012

Я использовал следующий метод для компиляции Clang для C ++ в Windows 7, и он был проверен Mysticial и другими:

  1. Загрузите и установите MinGW (убедитесь, что вы установиликомпилятор C ++) и поместите папку bin в вашу PATH (у меня MinGW 4.6.1 и успешно протестированы на другом компьютере с 4.6.2)
  2. Убедитесь, что в вашей PATH есть Python ( не 3 , у меня 2,7)
  3. (Необязательно: убедитесь, что в вашей переменной PATH есть Perl (я использовал ActivePerl 5.14.2 64-bit))
  4. Получить CMake и поместите его в свой PATH
  5. Перейдите на страницу LLVM-загрузки и загрузите исходный код LLVM 3.0 вместе с исходным кодом Clang.Не получайте код из SVN, он не работает с заголовками MinGW.
  6. Извлекайте исходные коды;У меня был источник llvm в папке с именем llvm-3.0.src на рабочем столе
  7. Поместите источник clang непосредственно в папку с именем «clang» (он должен называться именно так, иначе вы соберете llvm, но clang выигралв папку "tools" внутри папки с исходным кодом llvm, это должно сделать ваши каталоги похожими на:
    • llvm source
      • папка autoconf
      • ...
      • папка инструментов
        • ...
        • папка clang
          • папка привязок
          • ...
          • Makefile file
          • ...
        • ...
      • ...
  8. Создайте папку с именем «build» в том же каталоге, что и исходная папка llvm
  9. Откройте командную строку и перейдите в папку сборки
  10. Запуститекоманда cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src

    • (последний аргумент - это относительный путь к папке, в которой находится источник llvm (и источник clang в подкаталоге tools / clang))

    • Это будет эквивалентно команде «configure», и файлы makefile и все будет сгенерировано в папке сборки

    • Это займет несколько минут
  11. Запустите команду mingw32-make

    • Это скомпилирует llvm и clang, и исполняемые файлы clang будут сгенерированы в папке build / bin
    • Это, вероятно,занять длительное время.(Вы можете попытаться ускорить его, добавив параллельные сборки, опция -j<number>). Возможно, было бы хорошо закрыть все другие программы, чтобы ваш компьютер мог сконцентрироваться, чтобы они не мешали длительному процессу компиляции, напримерблокировка папки, в которую пишет компилятор (это случилось со мной).Я даже отключил антивирус и брандмауэр, чтобы они не пытались сканировать сгенерированные файлы и мешать им.

Время для тестирования

  1. Создайте файл .cpp в папке build / bin (я буду использовать hello.cpp).Используйте стандартный заголовок библиотеки, чтобы убедиться, что включаемые пути и библиотеки работают.Начните с очень простой программы.

    (с чего я начал:

    #include <iostream>
    
    int main() {
        std::cout << "hi";
    }
    

    )

  2. Запустите команду clang hello.cpp -std=c++0x -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++" -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++\mingw32" -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../.. -L/mingw/lib -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt

    (- L указывает каталог для поиска библиотек, а -l указывает библиотеку для связи) (Если у вас не установлен MinGW по тому же пути, что и я, вы можете узнать пути с помощью команды "g ++ somefile.cpp -v ", чтобы заставить g ++ рассказать о том, какие параметры он использует для путей к библиотекам, библиотечных файлов и всего остального. Поиск в конце вывода для параметров -L и -l.Имена файлов .o перемежаются с -L. Clang использует многие из тех же опций, что и g ++, поэтому я буквально скопировал и вставил эту строку из вывода g ++)

    Это должно скомпилировать вашу программу и создать файлс именем a.out

  3. переименуйте a.out в a.exe или любой другой файл

  4. Запустите .exe
  5. Ваша программа должна запуститься.

Clang (3.0) по-прежнему имеет некоторые проблемы в Windows (я не знаю, есть ли эти проблемы и в Linux).Например, компиляция лямбды (которую не поддерживает clang) с -std = c ++ 0x вызовет сбой clang и выдаст диагностическую ошибку.(Мне сообщили в IRC LLVM, что это происходит потому, что в clang реализован синтаксический анализ лямбд, а не семантический анализ, то есть фаза, на которой происходит сбой (потому что они забыли отключить разбор лямбд для версии 3.0), и они уже знают об этомошибка)

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

  1. Заголовки Windows, похоже, работают.
  2. В настоящее время работает только для 32-разрядных.
  3. 64-битная компилируется нормально, но не собирается.
  4. SSE, вероятно, в порядке.([Mysticial не] проверил работающий SSE на 32-битном.)
5 голосов
/ 20 ноября 2014

Вот , что работало в моей среде, в Windows 8.1, в целом аналогично инструкции Сета, но с более свежими инструментами.

  1. Я установил MinGW 64 в C:/MinGW, если быть точным, я использовал STL .
  2. Я установил Python 3, только что взял их последнюю версию.
  3. Я установил CMake 3.0.2
  4. Я раздвоил LLVM и Clang на Github и клонировал их на свою машину, поместив репозиторий Clang в папку llvm \ tools \ clang (структура описана на официальной page , они просто показывают примеры с svn вместо git).
  5. Я создал папку «build» рядом с папкой «llvm», и внутри папки «build» запустил эту команду: cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm (по какой-то причине CMake не смог автоматически найти «make»)
  6. Затем я запустил "make", чтобы действительно построить. Сборка заняла пару часов.
  7. После этого в другой папке я создал 1.cpp, который выполняет лямбда-выражение для вывода "hi":
#include <iostream>

int main() {
    []{ std::cout << "hi"; }();
}
  1. Я также создал cmd-файл для компиляции cpp. В качестве альтернативы вы можете просто установить переменную PATH правильно с помощью других средств. Обратите внимание, что GCC vesrion в вашем пакете MinGW может отличаться. Кроме того, у Clang есть несколько встроенных путей, которые он пробует, но они привязаны к конкретным версиям GCC, и мой не был среди них, поэтому мне пришлось явно указать пути включения.
set PATH=<path to the build folder from step 5>/bin;c:/mingw/bin;%PATH% 
clang++ -std=c++11 1.cpp -o 1.exe -I"C:/MinGW/include"
-I"C:/MinGW/include/c++/4.9.1" -I"C:\MinGW\include\c++\4.9.1\x86_64-w64-mingw32" -I"C:\MinGW\x86_64-w64-mingw32\include"
  1. Запуск этого cmd скомпилировал 1.cpp в 1.exe, который напечатал «hi».

Что не сработало :

  1. Я пытался собрать те же исходные коды llvm + clang без MinGW + GCC, используя компилятор MSVC из VS 2015 CTP. Он успешно скомпилировал Clang, единственное отличие состоит в том, что вам нужно сделать это из окна CMD разработчика, и вам нужно будет запустить cmake -G "Visual Studio 12" ..\llvm, а затем скомпилировать решение в Visual Studio. Однако из-за того, что Clang не удалось скомпилировать образец cpp, он пожаловался на «необъявленный идентификатор char16_t» и «__int128 не поддерживается для этой цели» в заголовках стандартной библиотеки MinGW. Если я использую заголовки clang-cl и MS STL, он жалуется на спецификаторы throw x (y). Возможно, мне нужно было предоставить несколько дополнительных ключей для сборки, но я не смог заставить ее работать.

C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ include \ xiosbase (293,4): ошибка: пока не может скомпилировать это выражение броска _THROW_NCEE (ошибка, "ios_base :: eofbit set"); C: \ Program Files (x86) \ Microsoft Visual Studio 14.0 \ VC \ include \ xstddef (56,30): примечание: расширен из макроса '_THROW_NCEE' #define _THROW_NCEE (x, y) throw x (y)

2 голосов
/ 04 марта 2013

См. http://clang.llvm.org/get_started.html#buildWindows

Я использовал "Visual Studio 11 Win64" с cmake, и он работал с доступным в настоящее время VS Express для рабочего стола.

Также для lib, которую я используюMinGW-W 64 и для отсутствующих файлов SUA.http://mingw -w64.sourceforge.net / и http://www.suacommunity.com/

Для компоновки .o, скомпилированного clang ++ для использования с двоичными файлами W 64 , я использую -m i386pep с компоновщиком ld снова поставляется в поставляемом W 64 .

0 голосов
/ 17 сентября 2013

У меня были многочисленные проблемы со сборкой LLVM и clang с использованием VS и, будучи пользователем Unix, я предпочитаю создавать исходники из командной строки.

Следуя инструкциям Сета Карнеги, я собрал его из репозитория SVN, а не из поставляемых пакетов, используя LLVM v3.3 и MinGW v4.5.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...