Поиск…


Вступление

C ++, как и C, имеет долгую и разнообразную историю, связанную с процессами компиляции и процессами сборки. Сегодня C ++ имеет различные популярные системы сборки, которые используются для компиляции программ, иногда для нескольких платформ в рамках одной системы сборки. Здесь будут рассмотрены и проанализированы несколько систем сборки.

замечания

В настоящее время нет универсальной или доминирующей системы сборки для C ++, которая является популярной и кросс-платформенной. Тем не менее, существует несколько крупных систем построения, которые привязаны к основным платформам / проектам, наиболее заметным из которых является GNU Make с операционной системой GNU / Linux и NMAKE с системой Visual C ++ / Visual Studio.

Кроме того, некоторые интегрированные среды разработки (IDE) также включают специализированные системы сборки, которые будут использоваться специально с родной средой IDE. Некоторые генераторы системы сборки могут генерировать эти собственные форматы IDE / форматы проекта, такие как CMake для Eclipse и Microsoft Visual Studio 2012.

Создание среды сборки с помощью CMake

CMake создает среду сборки практически для любого компилятора или IDE из одного определения проекта. В следующих примерах показано, как добавить файл CMake в кросс-платформенный код «Hello World» C ++ .

Файлы CMake всегда называются «CMakeLists.txt» и должны уже существовать в корневом каталоге каждого проекта (и, возможно, в подкаталогах тоже). Основной файл CMakeLists.txt выглядит так:

cmake_minimum_required(VERSION 2.4)

project(HelloWorld)

add_executable(HelloWorld main.cpp)

Смотрите на живую в Колиру .

Этот файл сообщает CMake имя проекта, какую версию файла ожидать и инструкции для создания исполняемого файла под названием «HelloWorld», для которого требуется main.cpp .

Создайте среду сборки для вашего установленного компилятора / IDE из командной строки:

> cmake .

Создайте приложение с помощью:

> cmake --build .

Это создает среду сборки по умолчанию для системы, в зависимости от ОС и установленных инструментов. Держите исходный код в чистоте от любых артефактов сборки с использованием «внекорпоративных» сборников:

> mkdir build
> cd build
> cmake ..
> cmake --build .

CMake также может абстрагировать основные команды платформы оболочки из предыдущего примера:

> cmake -E make_directory build
> cmake -E chdir build cmake .. 
> cmake --build build 

CMake включает в себя генераторы для ряда общих инструментов сборки и IDE. Чтобы создать make - nmake для nmake Visual Studio :

> cmake -G "NMake Makefiles" ..
> nmake

Компиляция с GNU make

Вступление

GNU Make (стиль make ) - это программа, предназначенная для автоматизации выполнения команд оболочки. GNU Make - это одна конкретная программа, которая подпадает под семейство Make. Они остаются популярными среди Unix-подобных и POSIX-подобных операционных систем, в том числе производных от ядра Linux, Mac OS X и BSD.

GNU Make особенно примечателен тем, что он подключен к проекту GNU, который подключен к популярной операционной системе GNU / Linux. GNU Make также имеет совместимые версии, работающие на разных вариантах Windows и Mac OS X. Это также очень стабильная версия с историческим значением, которое остается популярным. Именно по этим причинам GNU Make часто учат вместе с C и C ++.

Основные правила

Чтобы скомпилировать с make, создайте Makefile в каталоге проекта. Ваш Makefile может быть таким же простым, как:

Makefile

# Set some variables to use in our command
# First, we set the compiler to be g++
CXX=g++

# Then, we say that we want to compile with g++'s recommended warnings and some extra ones.
CXXFLAGS=-Wall -Wextra -pedantic

# This will be the output file
EXE=app

SRCS=main.cpp

# When you call `make` at the command line, this "target" is called.
# The $(EXE) at the right says that the `all` target depends on the `$(EXE)` target.
# $(EXE) expands to be the content of the EXE variable
# Note: Because this is the first target, it becomes the default target if `make` is called without target
all: $(EXE)

# This is equivalent to saying
# app: $(SRCS)
# $(SRCS) can be separated, which means that this target would depend on each file.
# Note that this target has a "method body": the part indented by a tab (not four spaces).
# When we build this target, make will execute the command, which is:
# g++ -Wall -Wextra -pedantic -o app main.cpp
# I.E. Compile main.cpp with warnings, and output to the file ./app
$(EXE): $(SRCS)
    @$(CXX) $(CXXFLAGS) -o $@ $(SRCS)

# This target should reverse the `all` target. If you call
# make with an argument, like `make clean`, the corresponding target
# gets called.
clean:
    @rm -f $(EXE)

ПРИМЕЧАНИЕ. Убедитесь, что отступы имеют вкладку, а не четыре пробела. В противном случае вы получите сообщение об ошибке Makefile:10: *** missing separator. Stop.

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

$ cd ~/Path/to/project
$ make
$ ls
app  main.cpp  Makefile

$ ./app
Hello World!

$ make clean
$ ls
main.cpp  Makefile

Инкрементальные сборки

Когда вы начинаете иметь больше файлов, make становится более полезным. Что делать, если вы отредактировали файл a.cpp, но не b.cpp ? Перекомпиляция b.cpp займет больше времени.

Со следующей структурой каталогов:

.
+-- src
|   +-- a.cpp
|   +-- a.hpp
|   +-- b.cpp
|   +-- b.hpp
+-- Makefile

Это будет хороший Makefile:

Makefile

CXX=g++
CXXFLAGS=-Wall -Wextra -pedantic
EXE=app

SRCS_GLOB=src/*.cpp
SRCS=$(wildcard $(SRCS_GLOB))
OBJS=$(SRCS:.cpp=.o)

all: $(EXE)

$(EXE): $(OBJS)
    @$(CXX) -o $@ $(OBJS)

depend: .depend

.depend: $(SRCS)
    @-rm -f ./.depend
    @$(CXX) $(CXXFLAGS) -MM $^>>./.depend

clean:
    -rm -f $(EXE)
    -rm $(OBJS)
    -rm *~
    -rm .depend

include .depend

Снова посмотрите вкладки. Этот новый Makefile гарантирует, что вы только перекомпилируете измененные файлы, минимизируя время компиляции.

Документация

Для получения дополнительной информации см. Официальную документацию Free Software Foundation , документацию по стеку и подробный ответ dmckee на stackoverflow .

Строительство с помощью SCons

Вы можете построить кросс-платформенный код «Hello World» C ++ , используя инструмент разработки программного обеспечения Scons - A Python- language.

Сначала создайте файл SConstruct (обратите внимание, что SCons будет искать файл с этим точным именем по умолчанию). На данный момент файл должен находиться в каталоге прямо по вашему hello.cpp . Напишите в новом файле строку

 Program('hello.cpp')

Теперь, с терминала, запустите scons . Вы должны увидеть что-то вроде

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o hello.o -c hello.cpp
g++ -o hello hello.o
scons: done building targets.

(хотя информация будет зависеть от вашей операционной системы и установленного компилятора).

Классы Environment и Glob помогут вам настроить конфигурацию. Например, файл SConstruct

env=Environment(CPPPATH='/usr/include/boost/',
    CPPDEFINES=[],
    LIBS=[],
    SCONS_CXX_STANDARD="c++11"
    )

env.Program('hello', Glob('src/*.cpp'))     

создает исполняемый hello , используя все файлы cpp в src . Его CPPPATH - это /usr/include/boost и он указывает стандарт C ++ 11.

Ниндзя

Вступление

Система сборки ниндзя описывается на веб-сайте проекта как «небольшая система сборки с акцентом на скорость». Ninja предназначен для создания файлов, созданных генераторами системных файлов, и использует низкоуровневый подход для создания систем, в отличие от более высокоуровневых системных менеджеров, таких как CMake или Meson.

Ninja в основном написан на C ++ и Python и был создан как альтернатива системе сборки SCons для проекта Chromium.

NMAKE (Утилита технического обслуживания Microsoft)

Вступление

NMAKE - это утилита командной строки, разработанная Microsoft для использования в основном в сочетании с инструментами командной строки Microsoft Visual Studio и / или Visual C ++.

NMAKE - это система сборки, которая подпадает под семейство систем сборки, но имеет определенные отличительные особенности, которые отличаются от Unix-подобных программ Make, таких как поддержка синтаксиса пути к файлу Windows (который сам по себе отличается от путей файлов в стиле Unix).

Autotools (GNU)

Вступление

Autotools - это группа программ, которые создают GNU Build System для данного программного пакета. Это набор инструментов, которые работают вместе для создания различных ресурсов сборки, таких как Makefile (для использования с GNU Make). Таким образом, Autotools можно считать генератором системы де-факто.

Некоторые известные программы Autotools включают в себя:

  • Autoconf
  • Automake (не путать с make )

В общем, Autotools предназначен для создания Unix-совместимого скрипта и Makefile, чтобы позволить следующей команде создавать (а также устанавливать) большинство пакетов (в простом случае):

./configure && make && make install

Таким образом, Autotools также имеет отношение к определенным менеджерам пакетов, особенно к тем, которые подключены к операционным системам, которые соответствуют стандарту POSIX.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow