Как скомпилировать Clang на Windows

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

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

Ответ 1

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

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

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

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

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

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

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

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

    (Что я начал с:

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

    )

  • Запустите команду 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

  • переименуйте a.out в a.exe или что-то еще

  • Запустите .exe
  • Ваша программа должна работать.

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

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

  • Заголовки Windows, похоже, работают.
  • В настоящее время работает только для 32-разрядных.
  • 64-разрядные компиляции отлично, но не собираются.
  • SSE, вероятно, в порядке. ([Mystical не проверил] работоспособный SSE на 32-битном, хотя.)

Ответ 2

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

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

int main() {
    []{ std::cout << "hi"; }();
}
  1. Я также создал файл cmd для компиляции cpp. В качестве альтернативы вы можете просто настроить PATH-переменную с помощью других средств. Обратите внимание, что GCC vesrion в вашем пакете MinGW может отличаться. Кроме того, у Клана есть несколько встроенных путей, которые он пытается, но они привязаны к конкретным версиям GCC, а мой не был среди них, поэтому я должен был явно указать пути include.
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, который напечатал "привет".

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

  • Я попытался создать те же источники llvm + clang без MinGW + GCC, используя компилятор MSVC из VS 2015 CTP. Он успешно создал Clang, единственное различие заключается в том, что вам нужно сделать это из окна CMD Developer, и вам нужно запустить 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): error: не удается скомпилировать это выражение throw _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)

Ответ 3

Обратитесь 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.

Ответ 4

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

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