Сборка и запуск проекта с make
Сборка и запуск проекта с make Создадим первый проект, состоящий из 2-х файлов main.cpp и makefile (можно создать в nano/kate/pluma) со следующим содержимым. Что тут делвется — main.cpp просто выводит строчку в консоль В makefile проверяется создана ли папка bin для объектных файлов, если нет, то создается компилируется файл main.cpp в bin/main.o формируется исполняемый файл […]
Компилятор g++ флаги
Компилятор g++ флаги Стандарты С++ -std=c++98 — C++98 -std=c++11 — C++11 -std=c++14 — C++14 -std=c++17 — C++17 -std=c++2a — C++20 Предупреждения -Wall — Выводит большинство предупреждений -Wfloat-equal — Предупреждает о не безопасном сравнении -Wsign-conversion или -Wsign-promo — Предупреждения преобразования signed в unsigned (и обратно) -Wold-style-cast — Выводит C Style преобразования типов -Warray-bounds — Доступ за […]
Включение других makefile
Включение других makefile Включение других makefile весьма удобно при создании подпроектов – у каждого из подпроектов свой собственный makefile и в главном проекте происходит их “глобальная сборка” Примечание – символ табуляции в начале строки перед include недопустим 1 способ – лучше не использовать (только в GNU) include makefile1 makefile2 … 2 способ определяем поддиректории и […]
07. Функции
Функции В make есть встроенные функции (в новых версиях make можно создавать свои) синтаксис $(function arg1, arg2…argN) аргументы разделяются запятыми Данные рисунки нашел на просторах интернета, весьма подробное описание есть в книжке по make https://www.gnu.org/software/make/manual/make.pdf функции для имен файлов на 91стр (103 стр pdf)
06. Циклы
Циклы В make циклы представлены одним лишь foreach, который проверяет все элементы из списка синтаксис $(foreach var,list,text) Над каждым словом (переменная var) в списке слов из list будет выполнятся действие (text) Пример: find_files = $(wildcard $(dir)/*) #параметр/шаблон поиска dirs := a b c d #некоторые директории #пройдем по всем директориям и каждую проверит по шаблону […]
05. Операторы ветвления if else
Операторы ветвления if else Операторы ветвления (условные конструкции) используются для принятия выбора в зависимости от внешних параметров или исполняемого кода. синтакис: условие выполняется если выполнилось условие else выполняется если не выполнилось условие endif пример: ifeq ($(test), ON) [tab] #command1 … [tab] #commandN else [tab] @echo Failed endif Условные директивы ifeq(arg1, arg2) #if equal ifneq(arg1, arg2) […]
03. Шаблонные правила
Шаблонные правила Шаблонные правила указывают как из файлов с расширением .x получить .y при помощи команды command. Чтобы отменить шаблонное правило – надо определить шаблонное правило без команды Чтобы Отключить действие всех суффиксов правил используется директива .SUFFIX: общий вид %.x : %.y [tab] command Например отменим создание объектных файлов для .c файлов %.o : %.c […]
04. Переменные
Переменные В имени переменных обычно используются заглавные буквы, цифры и подчеркивания, НЕЛЬЗЯ использовать # = : Пример объявления переменной TARGET TARGET = mainfile обращение: $(TARGET) = — переменная вычисляется каждый раз при обращении (рекурсивно вычисляемая) := — переменная вычисляется 1 раз при присваивании (как define) (только в GNU) Ссылка с заменой: пусть есть SOURCES=main.cpp file1.cpp […]
01. Состав makefile
Состав makefile Makefile состоит из правил, переменных и директив Команды: Перед командой используется знак табуляции Перенести длинную команду/переменные и тд можно с помощью знака “\” Команды выполняются когда изменились зависимости (когда файлы от которых зависит цель новее чем сама цель) @ — указывает НЕ выводить команду в терминал — (тире) перед командой указывает игнорировать ошибки […]
02. Зависимости у целей. Неявные правила
Зависимости у целей Для сборки целей нужно выставить зависимости – т.е. прописать от чего зависит цель (файлы .cpp и .h) Если зависимости проставлены, то может использоваться инкрементальная компиляция (т.е. не происходит повторной компиляции АКТУАЛЬНЫХ данных) что ускоряет сборку. Актуальность проверяется по времени изменения. Т.е. если исходники старее чем собранный файл – то не производится пересборка. […]