GNU Make C++. Linux

165
28 апреля 2019, 17:30

Возможно, не совсем понимая что искать, не могу найти действующего примера. Проект на C++, разбит на подпапки(src:Engine{Component, Utils}, Process{Objects,...,etc}). Как описать MakeFile, чтобы он собирал исходники по папкам? Из всего, что наскрёб, увидел вариацию "в каждой папке по MakeFile", что немного дезориентировало. Если это тот самый способ, есть ли необходимость повторения в каждом указания используемых библиотек(Boost'a, к примеру), флагов и т.д. ? Заранее спасибо.

Answer 1

увидел вариацию "в каждой папке по MakeFile"

наличие отдельного файла с инструкциями для программы gnu/make в каждом сборочном каталоге не всегда обязательно, хотя, наверно, удобно.

вместо тысячи слов лучше привести примитивный пример

пусть имеется такая структура файлов/каталогов:

$ tree
.
├── GNUmakefile
├── program.cpp
└── somepart
    └── somecode.cpp
1 directory, 3 files

минимально необходимое содержимое файла GNUmakefile для данного случая — всего одна строка, декларирующая, что «для получения program нужны program.o и somepart/somecode.o»:

$ cat GNUmakefile
program: program.o somepart/somecode.o

проверяем, какие команды будет выполнять make (опция -n, она же --dry-run, только выводит последовательность команд, не выполняя их):

$ make -n
g++    -c -o program.o program.cpp
g++    -c -o somepart/somecode.o somepart/somecode.cpp
cc   program.o somepart/somecode.o   -o program

чуть подробнее о том, откуда программа make всё это взяла — в другом моём ответе.

надо добавить что-нибудь в (например) опции для c++? используйте подходящую переменную:

$ cat GNUmakefile
CXXFLAGS += -I/путь/к/boost
program: program.o somepart/somecode.o

проверка:

$ make -n
g++ -I/путь/к/boost   -c -o program.o program.cpp
g++ -I/путь/к/boost   -c -o somepart/somecode.o somepart/somecode.cpp
cc   program.o somepart/somecode.o   -o program

если всё-таки подребуется отдельный файл, то вызывается он обычно рецептом вида:

$(MAKE) -C подкаталог

чтобы вызываемому экземпляру программы gnu/make «попала» какая-нибудь переменная, надо её явно экспортировать с помощью директивы export в «основном» файле:

export CXXFLAGS += ...
READ ALSO
Сложение volatile - UB?

Сложение volatile - UB?

Содержит ли следующая программа UB?

128
Python. char как в С/С++

Python. char как в С/С++

в с++ машина видит char как целочисленный тип и можно просто брать и делать так:

146
Захват глобальных переменных лямбдой

Захват глобальных переменных лямбдой

Как правильно захватывать глобальные переменные в лямбде? Хочу использовать следующим образом, но выдаются предупрежденияКак их подавить?

111
Включить все заголовочные файлы

Включить все заголовочные файлы

Можно ли как-то включить в maincpp все возможные заголовочные файлы языка, чтобы каждый раз не думать, что подключать? Может есть специальный...

164