Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

Например, чтобы из исходных файлов из примера 1.3 собрать исполняемый файл с помощью GCC в Unix, создайте такой make-файл, как показанный в примере 1.23.

Пример 1.23. make файл для hellobeatles.exe с использованием GCC

# Укажите исходные файлы, целевой файл, директории сборки

# и директорию установки

SOURCES = hellobeatles.cpp

OUTPUTFILE = hellobeatles

LIBJOHNPAUL = libjohnpaul.a

LIBGEORGERINGO = libgeorgeringo.so

JOHNPAULDIR = ../johnpaul

GEORGERINGODIR = ../georgeringo

INSTALLDIR = ../binaries

#

#
Добавьте в путь поиска заголовочных файлов родительскую директорию

#

CPPFLAGS += -I..

#

# Цель по умолчанию

#

.PHONY: all

all: $(HELLOBEATLES)

#

# Цель для сборки исполняемого файла.

#

$(OUTPUTFILE): $(subst .cpp,.о,$(SOURCES)) \

 $(JOHNPAULDIR)/$(LIBJOHNPAUL) \

 $(GEORGERINGODIR)/$(LIBGEORGERINGO)

$(CXX) $(LDFLAGS) -o $@ $^

.PHONY: install

install:

mkdir -p $(INSTALLDIR)

cp -p $(OUTPUTFILE) $(INSTALLDIR)

.PHONY: clean

clean:

rm -f *.o

rm -f $(OUTPUTFILE)

#Сгенерируйте зависимости .cpp-файлов от .hpp-файлов

include $(subst .cpp,.d,$(SOURCES))

%.d: %.cpp

$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@..$$$$ > $@; \

rm -f $@.$$$$

Далее в директории, содержащей johnpaul, georgeringo, hellobeatles и binaries, создайте главный make-файл, как показано в примере 1.24.

Пример 1.24. Главный make-файл для исходного кода из примеров 1.1, 1.2 и 1.3

# Все цели в этом make-файле — фиктивные

PHONY: all johnpaul georgeringo hellobeatles

# Цель по умолчанию

all: hellobeatles

# Цели johnpaul, georgeringo и hellobeatles представляют

# директории, командный сценарий вызывает make в каждой из них

johnpaul georgeringo hellobeatles

$(MAKE) --directory=$@ $(TARGET)

#
Это правило указывает что цель по умолчанию make-файла

# в директории hellobeatles зависит от целей по умолчанию

# make-файлов из директорий johnpaul и georgeringo

.PHONY: hellobeatles

hellobeatles: johnpaul georgeringo

Чтобы собрать hellobeatles, перейдите в директорию, содержащую главный make-файл, и введите

make
. Чтобы скопировать файлы libjohnpaul.a, libgeorgeringo.so и hellobeatles в директорию binaries, введите
make TARGET=install
. Чтобы очистить проект, введите
make TARGET=clean
.

Обсуждение

Подход к управлению сложными проектами, продемонстрированный в этом рецепте, известен как рекурсивный make (recursive make). Он позволяет организовать проект в виде набора модулей, каждый со своим собственным make-файлом, и указать зависимости между этими модулями. Он не ограничен одним главным make-файлом с набором дочерних make-файлов: эта методика может применяться для обработки многоуровневых древовидных структур. В то время, пока рекурсивный make был стандартной методикой управления большими проектами с помощью make, появились другие методы, которые теперь рассматриваются как более качественные. За подробностями снова обратитесь к Managing Projects with GNU make, Third Edition Роберта Мекленбурга (O'Reilly).

Пример 1.23 — это прямое применение методик, продемонстрированных в рецептах 1.15, 1,16 и 1.17. В нем есть один очень интересный момент. Как показано в рецепте 1.15, при компиляции hellobeatles.cpp из командной строки необходимо использовать опцию – I.., говорящую компилятору, где искать заголовочные файлы johnpaul.hpp и georgeringo.hpp. Одним из возможных решений является написание явного правила сборки hellobeatles.o с помощью командного сценария, содержащего опцию – I.. подобно этому.

hellobeatles.o: hellobeatles.cpp

g++ -с -I..
– о hellobeatles.o hellobeatles.cpp

Вместо этого я использовал точку настройки

CPPFLAGS
, описанную в рецепте 1.15, и указал, что всегда, когда происходит компиляция объектного файла из файла .cpp, в командную строку должна быть добавлена опция – I..:

CPPFLAGS += -I..

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

=
я использовал
+=
, так что новое значение будет добавляться к тому значению
CPPFLAGS
, которое могло быть указано в командной строке или в переменной среды.

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4