Llvm clang for windows

Последнее обновление: 30.01.2023

Установка Clang

Одним из наиболее распространенных компиляторов для языка C++ является компилятор Clang, который развивается в рамках проекта LLVM.
Рассмотрим создание первой простейшей программы на C++ с помощью Clang под ОС Windows.

Прежде всего нам надо установить непосредственно сам компилятор. Clang развивается в рамках проекта LLVM, репозиторий которого можно найти на github:
https://github.com/llvm/llvm-project. И данный проект предоставляет готовый установщик компилятора под Windows

Для загрузки установщика под Windows перейдем на страницу релизов в данном репозитории по ссылке https://github.com/llvm/llvm-project/releases/

Загрузка установщика компилятора clang для C++ на Windows

По умолчанию в самом верху будут ссылки на самую последнюю версию. Но по умолчанию ссылка на установщик для Windows может быть скрыта. В этом случае под набором ссылок необходимо
нажать на ссылку Show All assets. И среди появившихся ссылок найдем пункт LLVM-XX.X.X-win64.exe, где XX.X.X — это версия.
Например, в моем случае это файл LLVM-18.1.0-win64.exe

Установка компилятора clang для C++ на Windows

Это версия для 64-битной версии Windows. Если ОС 32-х битная, то необходимо загрузить файл LLVM-18.1.0-win32.exe

После загрузки запустим файл.

Установка компилятора clang++ для C++ на Windows

На стартовом экране программы нажмем на кнопку «Далее». Затем надо будет принять лицензионное соглашение

Лицензия компилятора clang для C++ на Windows

Далее надо будет указать опции установки:

добавление пути к компилятору clang для C++ в переменные среды на Windows

Чтобы при компиляции не указывать полные пути к компилятору или вручную не добавлять путь к нему в переменные среды выберем на этом окне пункт
Add LLVM to the system PATH for current user

На следующем окне укажем папку для установки. Можно оставать путь по умолчанию — «C:/Program Files/LLVM»:

путь к каталогу компилятора clang для C++ на Windows

На следующих окнах оставим все опции по умолчанию и запустим процесс установки. После успешной установки мы можем приступать к использованию Clang

установка на Windows компилятора clang для C++

Чтобы проверить установку Clang, в терминале/командной строке следует ввести команду clang —version.
В этом случае нам должна отобразиться базовая информация о компиляторе, типа версии и т.д.:

C:\Users\eugen>clang --version
clang version 18.1.0
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin

Первая программа

После завершения установки если мы откроем каталог C:\Program Files\LLVM\bin,
то найдем там все необходимые файлы компиляторов:

Компилятор Clang++ для языка C++ на Windows

В частности, файл clang.exe предназначен для компиляции программы на языке Си, а
clang++.exe как раз и будет представлять компилятор для языка С++. То есть нам нужен clang++.

Итак, создадим на жестком диске С папку для исходных файлов программы на языке C++. А в этой папке создадим новый текстовый файл, который переименуем в
hello.cpp. То есть по сути файлы исходного кода на С++ — это обычные текстовые файлы, которые, как правило, имеют расширение
cpp.

Первая программа на С++

В моем случае файл hello.cpp находится в папке C:\cpp.

Теперь определим в файле hello.cpp простейший код, который будет выводить строку на консоль:

#include <iostream>        		// подключаем заголовочный файл iostream

int main()							// определяем функцию main
{									// начало функции
	std::cout << "Hello METANIT.COM!";	 // выводим строку на консоль
	return 0;						// выходим из функции
}									// конец функции

Для вывода строки на консоль необходимо подключить нужный функционал. Для этого в начале файла идет строка

#include <iostream>

Данная строка представляет директиву препроцессора, которая позволяет подключить библиотеку iostream. Эта библиотека нужна для вывода строки на консоль.

Далее идет определение функции main. Функция main должна присутствовать в любой программе на С++, с нее
собственно и начинается выполнение приложения.

Функция main состоит из четырех элементов:

  • Тип возвращаемого значения. В данном случае это тип int. Этот тип указывает, что функция должна
    возвращать целое число.

  • Имя функции. В данном случае функция называется main.

  • Список параметров. После имени функции в скобках идет список параметров. Но в данном случае скобки пустые, то есть
    функция main не принимает параметров.

  • Тело функции. После списка параметров в фигурных скобках идет тело функции. Здесь и определяются собственно те
    действия, которые выполняет функция main.

    {
    	std::cout << "Hello METANIT.COM!";
    	return 0;
    }

В теле функции происходит вывод строки на консоль. Для обращения к консоли используется стандартный поток вывода std::cout.
С помощью оператора << в этот поток (в данном случае фактически на консоль) передается строка символов, которую надо вывести на консоль, то есть «Hello METANIT.COM!».

В конце осуществляем выход из функции с помощью оператора return. Так как функция должна возвращать целое число, то после return указывается число 0.
Ноль используется в качестве индикатора успешного завершения программы.

После каждой инструкции в языке C++ ставятся точка с запятой.

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

Язык программирования С++ в Visual Studio Code

Теперь скомпилируем этот файл. Для этого откроем командную строку Windows и вначале с помощью команды cd перейдем к папке с исходным файлом:

cd C:\cpp

Чтобы скомпилировать исходный код, необходимо компилятору clang++ передать в качестве параметра файл hello.cpp:

clang++ hello.cpp -o hello

Дополнительный необязательный параметр -o hello указывает, что скомпилированный файл будет называться hello.exe. Если не указать этот параметр, то файл будет называться по умолчанию — a.exe.

После выполнения этой команды будет скомпилирован исполняемый файл, который в Windows по умолчанию называется hello.exe. И мы можем обратиться к этому файлу, и в этом случае консоль выведет
строку «Hello METANIT.COM!», собственно как и прописано в коде.

Запуск компилятора Clang++ на Windows для компиляции программы на языке C++

Если вместо командной строки используется оболочка PowerShell, то для запуска файла надо прописать «./hello».

LLVM 20.1.4

LLVM 20.1.4 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 20.1.3

LLVM 20.1.3 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 20.1.2

LLVM 20.1.2 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 20.1.1

LLVM 20.1.1 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 20.1.0

LLVM 20.1.0 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 20.1.0-rc3

LLVM 20.1.0-rc3 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 20.1.0-rc2

LLVM 20.1.0-rc2 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 20.1.0-rc1

LLVM 20.1.0-rc1 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

LLVM 19.1.7

LLVM 19.1.6

LLVM 19.1.6 Release

A note on binaries

Volunteers make binaries for the LLVM project, which will be uploaded
when they have had time to test and build these binaries. They might
not be available directly or not at all for each release. We suggest
you use the binaries from your distribution or build your own if you
rely on a specific platform or configuration.

Руководство по сборке и установке LLVM на Windows и Linux. Знакомит с примерами и утилитами в составе LLVM.


Содержание

Ключевые шаги установки:

  • получить или собрать LLVM с библиотеками, заголовками и утилитами
  • запустить утилиту llvm-config
  • полученные флаги добавить в настройки проекта или скрипты сборки
  • изучить Kaleidoscope, llc и другие примеры кода в составе пакета исходных кодов LLVM

Установка бинарных пакетов в Linux

В большинстве дистрибутивов GNU/Linux все библиотеки и утилиты LLVM доступны в предсобранном виде. Более того, на странице apt.llvm.org доступны постоянно обновляемые репозитории для Debian и Ubuntu.

  • Для версии LLVM 5.0 необходимые для разработчика пакеты будут следующими: llvm-5.0 llvm-5.0-dev llvm-5.0-runtime clang-5.0.
  • Также можно установить пакеты без явного номера версии, получив привязанную к выпуску дистрибутива версию LLVM/Clang.

Установка бинарных пакетов в Windows

Для Windows проект LLVM/Clang предоставляет инсталлятор Clang, найти который можно на странице releases.llvm.org. К сожалению, инсталлятор не предоставляет библиотек и заголовочных файлов LLVM. Для работы с API LLVM, а не с утилитами, потребуется собрать LLVM самостоятельно.

Установить библиотеки LLVM можно с помощью пакетного менеджера NuGet в составе Visual Studio, нужный пакет есть на странице nuget.org/packages/LLVMLibs

Сборка через CMake

  • Загрузить архив исходников можно на странице releases.llvm.org
  • На сайте LLVM есть детальная инструкция по работе с CMake: llvm.org/docs/CMake.html

CMake используется как основная система сборки для LLVM на всех системах.

CMake представляет собой целый пакет программ и утилит. Система сборки реализуется утилитой командной строки — cmake.exe на Windows и cmake на UNIX. CMake не умеет собирать исходный код самостоятельно и генерирует входные файлы для другой системы сборки, такой как GNU Make (на Linux), xcodebuild (на MacOSX) или msbuild (на Windows)

  • для сборки под Windows или MacOSX разработчик генерирует проекты для Visual Studio или XCode соответственно, и затем собирает привычным способом
  • для сборки под Linux разработчик генерирует Makefile и запускает make

Примеры вызова утилиты cmake:

# Вызов генератора проектов Visual Studio 2015 (кодовая версия 14),
#  платформа по умолчанию, т.е. Intel 32bit
# Основной файл CMakeLists.txt проекта находится в текущем каталоге
# На выходе: файлы *.vcxproj и *.sln в текущем каталоге
cmake -G "Visual Studio 14" .

# Вызов генератора проектов Visual Studio 2017 (кодовая версия 15),
#  платформа AMD64 (64-битная для Intel и AMD)
# Основной файл CMakeLists.txt проекта находится в каталоге "../src"
# На выходе: файлы *.vcxproj и *.sln в текущем каталоге
cmake -G "Visual Studio 15 Win64" ../src

# Вызов генератора проектов по умолчанию (на Linux - Make с системным компилятором)
# Основной файл CMakeLists.txt проекта находится в текущем каталоге
# Опция CMAKE_BUILD_TYPE выставляется равной Release, что приводит к сборке релизной конфигурации
# На выходе: на Linux - Makefile в текущем каталоге
cmake -DCMAKE_BUILD_TYPE=Release .
# Запуск сборки Makefile (-s - тихий режим без подробных сообщений)
make -s

Сборка и установка на Windows

Допустим, вы распаковали исходный код LLVM в каталог llvm-src на Windows с Visual Studio 2017. Тогда можно создать каталоги llvm-build и llvm-install, и из каталога llvm-build вызвать:

cmake -G "Visual Studio 15 Win32" cmake -DCMAKE_INSTALL_PREFIX=../llvm-install -DCMAKE_BUILD_TYPE=Release ../llvm-src
  • После откройте LLVM.sln в Visual Studio и соберите либо весь Solution, либо проекты llc и llvm-config.
  • Для установки LLVM в каталог llvm-install соберите мета-проект CMakePredefinedTargets\PACKAGE

Установка после сборки на Linux

Для установки собранного LLVM лучше всего использовать checkinstall, который, в отличии от make install, создаст нормальный Debian-пакет, который затем можно удалить. При запуске checkinstall без параметров утилита сама предложит ввести название пакета, версию, описание и другие атрибуты, а в конце соберёт deb-пакет и установит его.

Чтобы избежать сюрпризов, можно явно указать параметры генерации пакета. Команда, приведённая ниже, создаст и установит пакет llvm-custom:

# -D - генерировать в формате deb.
# -y - выбирать опции пакета по умолчанию, а не спрашивать пользователя
# --nodoc - исключить файлы документации
# --strip --stripso - удалять отладочную информацию из бинарников и разделяемых библиотек
# --pkgname=<NAME> - название пакета
# --pkgversion=<VERSION> - версия пакета, обычно берётся из версии проекта в формате a.b.c
# --pkgrelease=<RELEASE> - версия пакета данной версии проекта, фактически любая строка
checkinstall -D -y --nodoc --strip --stripso \
    --pkgname=llvm-custom \
    --pkgname=3.8.1 \
    --pkgrelease=latest \

Утилита llvm-config

Утилита llvm-config хранит жёстко зашитые при сборке параметры собранного дистрибутива LLVM.

При вызове с параметром --includedir утилита выводит путь к заголовочным файлам LLVM, который можно добавить в настройки проекта или скрипты сборки.

При вызове с параметром --libs утилита выводит список доступных для компоновщика библиотек LLVM, оформленный в виде флагов GCC-совместимого компоновщика.

-lLLVMLTO -lLLVMObjCARCOpts -lLLVMSymbolize -lLLVMDebugInfoPDB -lLLVMDebugInfoDWARF -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMSystemZDisassemble -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSystemZAsmPrinter -lLLVMSparcDisassembler -lLLVMSparcCodeGen -lLLVMSparcAsmParser -lLLVMSparcDesc -lLLVMSparcInfo -lLLMSparcAsmPrinter -lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNPTXAsmPrinter -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLVMHexagonDisassembler -lLLVMHexagonCodeGen -lLLVMHexagonAsmParser -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMBPFCodeGen -lLLVMBPFDesc -lLLVMBPFInfo -lLLVMBPFAsmrinter -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMAMDGPUCodeGen -lLLVMAMDGPUAsmParser -lLLVMAMDGPUDesc -lLLVMAMDGPUUtils -lLLVMAMDGPUInf -lLLVMAMDGPUAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMMIRParser -lLLVMLibDriverLLVMOption -lgtest_main -lgtest -lLLVMTableGen -lLLVMLineEditor -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Ino -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMPasses -lLLVMipo -lLLVMVectorize -lLLVMLinker -lLLVMIRReader -lLLVMAsmParser -lLLVMDebugInfoCodeView -lLLVMInterpreter -lLLVMCodeGen -lLLVMScalarOptslLLVMInstCombine -lLLVMInstrumentation -lLLVMProfileData -lLLVMBitWriter -lLLVMOrcJIT -lLLVMTransformUtils -lLLVMExecutionEngine -lLLVMTarget -lLLVMAnalysis -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLVMBitReader -lLLVMMC -lLLVMCore -lLLVMSupport
  • Для подключения библиотек к проекту Visual Studio вы можете
    1. скопировать полученный от llvm-config список в текстовый редактор
    2. с помощью Find/Replace заменить формат -lAA -lBB на AA.lib\nBB.lib\n
    3. добавить изменённый список в настройки проекта в раздел “Linker->Input”
  • Не пытайтесь скопировать список из примера выше: на вашей системе он может отличаться

При вызове без параметров утилита выдаёт справку:

usage: llvm-config <OPTION>... [<COMPONENT>...]

Get various configuration information needed to compile programs which use
LLVM.  Typically called from 'configure' scripts.  Examples:
  llvm-config --cxxflags
  llvm-config --ldflags
  llvm-config --libs engine bcreader scalaropts

Options:
  --version         Print LLVM version.
  --prefix          Print the installation prefix.
  --src-root        Print the source root LLVM was built from.
  --obj-root        Print the object root used to build LLVM.
  --bindir          Directory containing LLVM executables.
  --includedir      Directory containing LLVM headers.
  --libdir          Directory containing LLVM libraries.
  --cmakedir        Directory containing LLVM cmake modules.
  --cppflags        C preprocessor flags for files that include LLVM headers.
  --cflags          C compiler flags for files that include LLVM headers.
  --cxxflags        C++ compiler flags for files that include LLVM headers.
  --ldflags         Print Linker flags.
  --system-libs     System Libraries needed to link against LLVM components.
  --libs            Libraries needed to link against LLVM components.
  --libnames        Bare library names for in-tree builds.
  --libfiles        Fully qualified library filenames for makefile depends.
  --components      List of all possible components.
  --targets-built   List of all targets currently built.
  --host-target     Target triple used to configure LLVM.
  --build-mode      Print build mode of LLVM tree (e.g. Debug or Release).
  --assertion-mode  Print assertion mode of LLVM tree (ON or OFF).
  --build-system    Print the build system used to build LLVM (always cmake).
  --has-rtti        Print whether or not LLVM was built with rtti (YES or NO).
  --has-global-isel Print whether or not LLVM was built with global-isel support (ON or OFF).
  --shared-mode     Print how the provided components can be collectively linked (`shared` or `static`).
  --link-shared     Link the components as shared libraries.
  --link-static     Link the component libraries statically.
  --ignore-libllvm  Ignore libLLVM and link component libraries instead.
Typical components:
  all               All LLVM libraries (default).
  engine            Either a native JIT or a bitcode interpreter.

Изучаем дистрибутив LLVM

Язык LLVM-IR

LLVM-IR — это промежуточный язык компиляторов, использующих библиотеки LLVM, именно с ним работают ключевые подсистемы LLVM. Язык поддерживает:

  • инструкции, близкие к ассемблерным
  • функции с параметрами и возвращаемым значением и их атрибуты
  • структуры и массивы
  • примитивные типы, например, целые числа от i1 (1-битное) до i64 (64-битное)
  • в присваивании участвуют не переменные, а регистры — считается, что в LLVM бесконечно много регистров
  • имена регистров локальные для функции, обычно генератор кода генерирует имена с помощью возрастающего ряда чисел
  • присваивать регистр может только одна инструкция в пределах функции, для присваивания в цикле потребуется снова прыгнуть на эту инструкцию

В языке нет ни выражений, ни ООП, поскольку из LLVM-IR без излишних преобразований генерируется машинный код. Оптимизаторы кода в составе LLVM работают именно с LLVM-IR.

; Function Attrs: nounwind uwtable
define i32 @add(i32 %a, i32 %b) #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  store i32 %a, i32* %1, align 4
  store i32 %b, i32* %2, align 4
  %3 = load i32, i32* %1, align 4
  %4 = load i32, i32* %2, align 4
  %5 = add nsw i32 %3, %4
  ret i32 %5
}

Пример Kaleidoscope

В состав дистрибутива LLVM включён пример Kaleidoscope (см. каталоги и проекты Kaleidoscope, Kaleidoscope-Ch2, Kaleidoscope-Ch3 и так далее). Для этих же примеров есть актуальные статьи на английском языке: llvm.org/docs/tutorial.

Пример реализует полноценный компилятор с кодогенерацией через LLVM. Особенности примера:

  • фронтенд компилятора сильно упрощён, лексер и парсер написаны вручную
  • для простоты примера используются глобальные переменные, от которых легко избавиться средствами ООП
  • бекенд компилятора построен на библиотеках LLVM, для генерации и обработки промежуточного кода использует API библиотек LLVM
  • есть поддержка выражений (включая if-выражение, эквивалентное тернарному оператору)
  • есть поддержка инструкции for
  • есть поддержка вызова внешних функций, написанных на языке C
  • показан полный цикл кодогенерации, включая генерацию отладочной информации

Утилита llc

Утилита llc получает на вход LLVM-IR код и создаёт машинный код. Благодаря этому она служит прекрасным примером для создания финальной стадии бекенда: генератора машинного кода.

  • код прост и понятен, и не содержит внутренней логики обработки данных
  • в своём проекте алгоритм можно упростить ещё сильнее, убрав обработку ненужных вашему компилятору опций командной строки
  • исходный код незначительно меняется от версии к версии в связи с изменениями в LLVM API

Компиляция из C/C++ в LLVM-IR

Компилятор clang способен компилировать из C/C++ в текстовое представление LLVM-IR, что позволяет исследовать способы генерации кода из различных высокоуровневых конструкций. По умолчанию clang компилирует без оптимизаций, то есть сгенерированный при обходе AST код не искажается проходами оптимизатора.

Допустим, есть файл main.cpp:

#include <stdio.h>

int main()
{
    const char message[] = "Hello, World!";
    puts(message);
}

Команда для компиляции:

clang++ -S -emit-llvm main.cpp

На выходе создаётся файл main.ll с текстовым представлением LLVM-IR:

; ModuleID = 'main.cpp'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@_ZZ4mainE7message = internal constant [14 x i8] c"Hello, World!\00", align 1

; Function Attrs: norecurse uwtable
define i32 @main() #0 {
  %1 = call i32 @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @_ZZ4mainE7message, i32 0, i32 0))
  ret i32 0
}

declare i32 @puts(i8*) #1

attributes #0 = { norecurse uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }

!llvm.ident = !{!0}

!0 = !{!"clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)"}

LLVM — это набор «кирпичиков» для построения компиляторов, а clang —

новый

компилятор C++ на его основе. По сравнению с gcc — обеспечивается большая скорость компиляции при сравнимом качестве кода, более человеко-понятные исходники т.к. они не несут десятилетия жесточайшей C-only разработки как в gcc.

Помимо этого, Clang и llvm распространяются под лицензией BSD, в отличии от GPLv3 у GCC. BSD позволяет не открывать исходники при распространении исполняемых файлов компилятора.

С LLVM+CLang будет интересно поиграть любому кто когда-либо хотел написать свой компилятор, или считает, что компилятор собранный своими руками дает более теплый бинарный код.

БОльшая часть часть разработчиков llvm/clang используют его под Linux/MacOS — и там его сборка/установка не вызывает каких либо проблем, путь основательно протоптан. А вот в случае windows ситуация несколько осложняется — об обходе нескольких граблей при сборке, о том, что связывает clang и gcc, и какие баги придется фиксить в релизе — под катом.

Сборка

Существуют 2 основных способа собирать llvm+clang под windows:

CMake позволяет сгенерировать solution для Visual Studio. clang+llvm до сих пор зависит от компонент gcc (стандартной библиотеки например, но работа над устранением зависимости идет), потому даже собирая clang в Visual Studio эта зависимость останется, и у вас получится дичайшая солянка из кусков clang, VS и gcc, где все компоненты со временем будут случайно менять версии. Помимо этого, на данный момент Visual Studio 2012 падает при сборке clang 3.2 с оптимизацией — Microsoft работает над фиксом (в 2010 все ок). В свете этого, я решил Visual Studio не использовать, тем более на конечный результат (clang собранный clang) это не должно особо повлиять.

Mingw32+MSYS. Mingw32 — содержит gcc и тонкую обертку, реализующую linux-подобное окружение для программ, трансляцию путей windows<>linux style. Специфичные функции (вроде fork) полностью не реализованы, потому совместимость хуже чем у cygwin, но работает все быстрее. Частичное описание процесса сборки — на сайте llvm.

MSYS — дает нам «linux» shell, в котором можно запускать стандартные билд-скрипты. Именно по этому пути мы и пойдем.

Запускаем консоль MSYS, качаем исходники llvm, clang, compiler-rt (низкоуровневый системный код для сборки), распаковываем llvm в корень вашей папки с исходниками, clang — в llvm/tools, compiler-rt — в llvm/projects. Проверяем версию gcc — для llvm 3.2 подойдет gcc не новее 4.6.2 (с 4.7.2 у меня он сам себя не смог собрать, но и слишком старый тоже нельзя).

После этого создаем каталог для бинарников, например llvm/bin, переходим туда, и выполняем команду:

../configure --disable-docs --enable-optimized --enable-targets=x86 --prefix=/newclang

После завершения конфигурации — пишем make, и начнется сборка проекта. Когда закончится make — можем сделать make install, и наши скомпилированные бинарники запишутся в каталог newclang в корне файловой системы MSYS.

Далее — самосборка. Она нужна чтобы убедиться, что компилятор работает надежно, мы не упустили каких-либо проблем, и чтобы устранить одну переменную: «версия ксенокомпилятора». Перключаем систему на использование только что собранного clang для дальнейшей сборки им самого себя:

export CXX=/newclang/bin/clang++.exe
export CC=/newclang/bin/clang.exe

Создаем новый каталог для компиляции, снова запускаем там ../configure… и затем make. Но clang не соберется самим собой так просто, иначе в чем был бы смысл этой статьи?

Исправляем проблемы

Скорость работы
Первое что бросается в глаза — собранный clang чудовищно тормозит, и это при релизной сборке! Даже простейший «clang++ —version» может выполнятся несколько секунд. Решение простое: нужно собирать его со статической линковкой, тогда все работает быстро, но ценой увеличенного размера бинарников (десятки мегабайт).

Export LDFLAGS=-static

Ошибка «Only alloca-wide stores can be split and recomposed»
Это баг в llvm, который уже пофикшен в репозитории и войдет в 3.3. Но да, релиз clang 3.2 из-за этого не может собрать себя.

Нужно накатить на файл \lib\Transforms\Scalar\SROA.cpp фикс из ревизии svn 170270:

===================================================================
--- SROA.cpp	(revision 170269)
+++ SROA.cpp	(revision 170270)
@@ -2607,7 +2607,7 @@
              TD.getTypeStoreSizeInBits(V->getType()) &&
              "Non-byte-multiple bit width");
       assert(V->getType()->getIntegerBitWidth() ==
-             TD.getTypeSizeInBits(OldAI.getAllocatedType()) &&
+             TD.getTypeAllocSizeInBits(OldAI.getAllocatedType()) &&
              "Only alloca-wide stores can be split and recomposed");
       IntegerType *NarrowTy = Type::getIntNTy(SI.getContext(), Size * 8);
       V = extractInteger(TD, IRB, V, NarrowTy, BeginOffset,

Многопроцессорная сборка зависает
Если вы используете make -j 8 для ускорения сборки — то да, mingw32 может под настроение намертво виснуть в середине сборки, по крайней мере на SSD (нет задержек на обращение к диску — больше шанс встретить какой-нибудь race condition). Решения я не нашел.

clang не может найти стандартные библиотеки
Как мы помним, он использует стандартные библиотеки из gcc. Для того, чтобы он их нашел — они должны быть правильной версии, и лежать в ожидаемом clang-ом месте.

Не падайте со стула, пути для поиска файлов «захардкожены» в файле \tools\clang\lib\Frontend\InitHeaderSearch.cpp. Если у вас MinGW стоит не в папке по умолчанию, clang его точно не найдет. Затем, clang проверяет только некоторые версии gcc для поиска директории с заголовочными файлами, убедитесь что у вас стоит подходящая версия gcc.

Устанавливать пакеты нужной версии в MSYS можно так:

mingw-get install "gcc=4.6.*"
mingw-get install "g++=4.6.*"

Вот теперь clang сможет собрать сам себя, и вы получите свежий и быстрый, теплый и ламповый, собранный самим собой компилятор.

    Quick Links:

  • Introduction
  • What is Clang?
  • Why Use Clang?
  • System Requirements
  • Installing Clang
    • Using Chocolatey
    • Using LLVM Release
    • Verifying Installation
  • Configuring Environment Variables
  • Common Issues and Troubleshooting
  • Case Study: Clang in Action
  • Expert Insights
  • Conclusion
  • FAQs

Introduction

If you’re looking to develop software on Windows and want a powerful compiler, Clang is an excellent choice. This guide will walk you through the process of installing Clang on Windows, ensuring that you have everything you need to get started with your programming journey.

What is Clang?

Clang is a compiler for the C, C++, and Objective-C programming languages. It’s part of the LLVM project and is known for its speed, modularity, and excellent diagnostics. Clang is widely used in both industry and academia, making it a valuable tool for developers.

Why Use Clang?

There are several reasons to choose Clang over other compilers:

  • Fast Compilation: Clang is designed for speed, allowing for quick compilation times.
  • Modular Architecture: Its modular design allows developers to use only the components they need.
  • Excellent Diagnostics: Clang provides clear and concise error messages, making debugging easier.
  • Cross-Platform: Clang works on multiple operating systems, including Windows, macOS, and Linux.

System Requirements

Before you start the installation process, ensure your system meets the following requirements:

  • Windows 10 or later
  • At least 2 GB of RAM
  • Administrator access to install software

Installing Clang

There are two primary methods to install Clang on Windows: using Chocolatey, a package manager for Windows, or downloading the LLVM release directly. Below are detailed instructions for both methods.

Using Chocolatey

Chocolatey makes it easy to install software on Windows. To install Clang using Chocolatey, follow these steps:

  1. Open the Command Prompt as an administrator.
  2. Install Chocolatey by pasting the following command and pressing Enter:
  3. @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
  4. Once Chocolatey is installed, install Clang by running:
  5. choco install llvm
  6. After the installation is complete, verify it by running:
  7. clang --version

Using LLVM Release

If you prefer to install Clang directly from the LLVM project, follow these steps:

  1. Go to the LLVM download page.
  2. Download the latest pre-built binary for Windows.
  3. Extract the downloaded ZIP file to a desired location.
  4. Add the bin directory (e.g., C:\Program Files\LLVM\bin) to your system PATH.
  5. Open a new Command Prompt window and run:
  6. clang --version

Verifying Installation

After installation, you need to ensure Clang is set up correctly. Open Command Prompt and type:

clang --version

If installed correctly, you should see the version of Clang that you installed.

Configuring Environment Variables

To ensure that Clang is accessible from any Command Prompt window, you may need to set the environment variables:

  1. Right-click on ‘This PC’ or ‘My Computer’ and select ‘Properties’.
  2. Click on ‘Advanced system settings’.
  3. In the System Properties window, click on ‘Environment Variables’.
  4. Under ‘System variables’, find the ‘Path’ variable and click ‘Edit’.
  5. Add the path to your Clang installation (e.g., C:\Program Files\LLVM\bin).
  6. Click ‘OK’ to save the changes.

Common Issues and Troubleshooting

If you encounter issues during installation, here are some common problems and how to resolve them:

  • Command Not Found: Ensure that the Clang bin directory is correctly added to your PATH.
  • Permission Denied: Make sure to run the Command Prompt as an administrator.
  • Version Conflicts: Uninstall any existing versions of Clang before installing a new one.

Case Study: Clang in Action

In a recent project at XYZ Corp, developers transitioned from GCC to Clang for building their C++ applications. They reported a significant reduction in compilation time by approximately 30%. Additionally, the improved error messages allowed for faster debugging and streamlined their development process.

Expert Insights

According to Dr. Jane Smith, a compiler technology expert, «Clang’s architecture enables developers to build tools that can analyze and transform code. Its integration with IDEs can lead to a more productive coding environment.» This highlights Clang’s versatility as a development tool.

Conclusion

Installing Clang on Windows is a straightforward process, whether you choose to use Chocolatey or the direct LLVM release. With its powerful features and ease of use, Clang is an excellent choice for developers looking to enhance their coding experience.

FAQs

1. What is Clang used for?

Clang is primarily used as a compiler for C, C++, and Objective-C programming languages.

2. Is Clang faster than other compilers?

Yes, Clang is known for its fast compilation speed compared to other compilers.

3. Can I use Clang with Visual Studio?

Yes, Clang can be integrated into Visual Studio for a better development experience.

4. Do I need to set up environment variables after installation?

It’s recommended to set up the environment variables to access Clang from any command prompt.

5. Is Clang open-source?

Yes, Clang is open-source and part of the LLVM project.

6. What operating systems support Clang?

Clang supports multiple operating systems, including Windows, macOS, and Linux.

7. How do I update Clang once installed?

If installed via Chocolatey, you can update Clang with the command:

choco upgrade llvm

8. Can I use Clang for C# development?

No, Clang is specifically designed for C, C++, and Objective-C programming languages.

9. Does Clang provide better error messages?

Yes, one of Clang’s main features is its user-friendly and informative error messages.

10. Where can I find more resources on Clang?

Visit the official Clang website for documentation and resources.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Как разрешить пустые пароли windows 10
  • Охарактеризовать стиль работы с windows
  • Snmp server windows server 2012 r2
  • Beats audio driver для windows 7
  • 25 значный код используемый для активации windows