- •Часть 2
- •Оглавление
- •Понятие класса
- •Конструкторы
- •Деструкторы
- •Поля данных и методы класса
- •Внешнее определение методов класса
- •Создание многофайлового проекта
- •Команда make и make-файлы
- •Синтаксис make-файла
- •Опции и параметры команды make
- •Зависимости
- •Правила
- •Комментарии в make-файле
- •Практическое занятие 16. Дружественные функции. Перегруженные операции. Дружественные функции
- •Перегрузка операций
- •Перегрузка операции присваивания
- •Перегрузка операции индексирования
- •Перегрузка операции вызова функции ( )
- •Создание собственных функций вставки и извлечения
- •Void exit(int код_возврата);
- •Практическое занятие 17. Функторы
- •Практическое занятие 18. Создание иерархии классов.
- •Конструкторы и деструкторы при наследовании
- •Поля и методы при наследовании
- •Операция присваивания и принцип подстановки
- •Практическое занятие 19. Динамический полиморфизм. Абстрактные классы Виртуальные методы
- •Абстрактные классы
- •Virtual тип_возврата имя_функции
- •Рекомендуемая литература
Зависимости
Зависимости определяют, как каждый файл в окончательном приложении связан исходными файлами.
Пусть окончательному приложению myappl требуются (оно зависит от) client.o, student.o; и также для client.o (client.cpp и student.h); student.o (student.cpp и student.h). Таким образом, на файл client.o влияют изменения файлов client.cpp и student.h, и он нуждается в пересоздании с помощью повторной компиляции файла client.cpp, если был изменен любой из двух указанных файлов.
В make-файле записываются эти правила, указывая имя задания, двоеточие, пробелы или табуляции и затем разделенный пробелами или табуляциями перечень файлов, применяемых для создания выходного файла задания. Приведем список зависимостей для рассматриваемого примера:
myappl: student.o client.o
student.o: student.cpp student.h
client.o: client.cpp student.h
Список свидетельствует о том, что myappl зависит от student.o и client.o, student.o зависит от student.cpp и student.h, а client.o зависит от client.cpp и student.h.
Данный набор зависимостей формирует иерархию, показывающую, как исходные файлы связаны друг с другом. Легко можно увидеть, что если изменяется student.h, то придется пересмотреть student.o, client.o, а поскольку student.o и client.o будут изменены, придется перестроить и myapp.
Если вы хотите собрать несколько файлов, можно использовать фиктивную цель или задание all. Пусть приложение состоит из двоичного файла myappl и интерактивного руководства myappl.1. Описать их можно следующей строкой:
all: myappl myappl.1
Если вы не включите задание all, программа make просто создаст выходной файл, первым найденный в make-файле.
Правила
Второй компонент make-файла – правила или инструкции, описывающие способ создания выходного файла задания.
В make-файлах существует синтаксическая разница между пробелами и табуляцией. Все правила должны представлять собой строки, начинающиеся со знака табуляции (пробел не годится).
Пробел в конце строки в make-файле может вызвать сбой при выполнении команды make.
Комментарии в make-файле
Комментарий в make-файле начинается со знака # и продолжается до конца строки. Как и в исходных файлах на языке С++, комментарии в make-файлах могут помочь понять, что имелось в виду во время написания данного файла.
Для нашего многофайлового проекта можно создать следующий make-файл с именем Makefile:
#Каждое правило начинается со знака табуляции
#Зависимость
myappl: student.o client.o
#Правило
g++ student.o client.o -o myappl
#Зависимость
student.o: student.cpp student.h
#Правило
g++ -c student.cpp
#Зависимость
client.o: client.cpp student.h
#Правило
g++ -c client.cpp
#Задание – удаление объектных файлов
clean:
rm -f student.o proverka.o
#Задание (нужно иметь права суперпользователя)
install:
cp myappl /usr/local/bin/myappl
Следующая важная особенность относится к двум дополнительным заданиям: clean и install.
В задании clean для удаления объектных файлов применяется команда rm. Команда начинается со знака “-“, тем самым сообщая команде make о необходимости игнорировать результат команды, поэтому make выполнится успешно, даже если объектных файлов нет и команда rm вернет ошибку. Правила для задания clean ни от чего не зависят, остаток строки после clean: пуст. Таким образом, задание всегда считается измененным со времени последнего выполнения, и его правило всегда выполняется, если clean указывается в качестве задания.
Задание install выполняет команды для установки приложения в указанное расположение.
Таким образом, мы выполняем следующие действия:
В директории Документы Домашней папки создаем директорию My_Proekt.
В Emacs создаем файлы: student.h, student.cpp, client.cpp и Makefile и помещаем их в директорию My_Proekt.
Загружаем встроенный в Emacs командный процессор. Делаем текущей директорию My_Proekt и запускаем на выполнение команду make, вводя с клавиатуры:
$ make -k и нажимаем Enter.
Запускаем программу на выполнение:
$ ./myappl
Задание:
Создать многофайловый проект с использованием компилятора g++ согласно своему варианту. Варианты даны в практическом занятии 14. Для своей многофайловой программы написать make-файл.
