Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решенные оветы на теорию Си.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
167 Кб
Скачать
☆

10. Создание файла проекта. Объектные файлы. Раздельная компиляция. Make-файлы.

Раздельная компиляция — трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль.

Исторически особенностью компилятора, отражённой в его названии, являлось то, что он производил как трансляцию, так и компоновку, при этом компилятор мог порождать сразу абсолютный код. Однако позже, с ростом сложности и размера программ (и увеличением времени, затрачиваемого на перекомпиляцию), возникла необходимость разделять программы на части и выделять библиотеки, которые можно компилировать независимо друг от друга. При трансляции каждой части программы компилятор порождает объектный модуль, содержащий дополнительную информацию, которая потом, при компоновке частей в исполнимый модуль, используется для связывания и разрешения ссылок между частями.

Объе́ктный мо́дуль— файл с промежуточным представлением отдельного модуля программы, полученный в результате обработки исходного кода компилятором. Объектный файл содержит в себе особым образом подготовленный код (часто называемый бинарным), который может быть объединён с другими объектными файлами при помощи редактора связей (компоновщика) для получения готового исполнимого модуля, либо библиотеки.

Объектные файлы представляют собой блоки машинного кода и данных, с неопределенными адресами ссылок на данные и процедуры в других объектных модулях, а также список своих процедур и данных. Компоновщик собирает код и данные каждого объектного модуля в итоговую программу, вычисляет и заполняет адреса перекрестных ссылок между модулями. Связывание со статическими библиотеками выполняется редактором связей или компоновщиком (который может представлять собой отдельную программу или быть частью компилятора), а с операционной системой и динамическими библиотеками связывание выполняется при исполнении программы после ее загрузки в память.

Рассмотрим простейший файл проекта типа .pro, используемый qmake и qt creator.

Содержимое файла:

CONFIG += qt debug

HEADERS += hello.h

SOURCES += hello.cpp

SOURCES += main.cpp

CONFIG, HEADERS, SOURCES - переменные.

В файле проекта переменные используются для хранения списков строк. В простых проектах эти переменные информируют qmake о параметрах настройки, именах файлов и каталогах, которые используются в процессе сборки.

Список наиболее важных переменных:

CONFIG Общие параметры настройки проекта.

DESTDIR Каталог, в который будет помещен исполняемый или бинарный файл.

FORMS Список .ui файлов, которые обработаны uic.

HEADERS Список имен заголовочных файлов (.h), используемых при сборке проекта.

QT Qt-ориентированные параметры конфигурации.

SOURCES Список файлов с исходным кодом, которые используются при сборке проекта.

TEMPLATE Шаблон, используемый в проекте. Он определяет, что будет на выходе процесса сборки: приложение, библиотека или подключаемый модуль.

Присваивание переменной значения: HEADERS = mainwindow.h paintwidget.h

Добавление строки в переменную: HEADERS + = mainwindow.h

Qmake создает Makefile на основе файла проекта .pro, который в дальнейшем используется утилитой make.

make — утилита, автоматизирующая процесс преобразования файлов из одной формы в другую. Чаще всего это компиляция исходного кода в объектные файлы и последующая компоновка в исполняемые файлы или библиотеки.

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

Структура Makefile:

Описание

Простой make-файл состоит из правил следующего вида:

цель [цель2 … цельN]: зависимость [зависимость2 … зависимостьN]

команда

[команда2]

…

[командаN]

Цель обычно представляет собой имя файла, генерируемого программой make; примерами

целей являются исполняемые или объектные файлы. Цель может также быть именем

выполняемого действия, как, например, clean.

Зависимость – это файл, используемый как вход для порождения цели. Часто цель зависит от нескольких файлов.

Команда – это действие, выполняемое утилитой make. Правило может иметь более чем одну команду, каждую на своей собственной строке. Внимание: каждая строка, содержащая команду, должна начинаться с символа табуляции. Обычно команда употребляется в правиле с зависимостями и служит для создания целевого

файла, если какая-либо из зависимостей изменилась.

Пример простейшего make-файла:

main.o: main.cpp

g++ -c main.cpp

Он содержит правило для make, указывающее на необходимость вызова компиляции файла main.cpp в файл main.o при изменении файла main.cpp.

Правило, в котором цель зависит от нескольких файлов:

10_Make_Qt: main.o numerical.o text_statistics.o

g++ main.o numerical.o text_statistics.o -o 10_Make_Qt

Когда цель является файлом, этот файл должен быть перекомпилирован или перекомпонован, если изменилась любая из его зависимостей. Кроме того, любые зависимости, которые

автоматически генерируются, должны обновляться первыми. В этом примере 10_Make_Qt

зависит от каждого из 3 объектных файлов; объектный файл numerical.o зависит от исходного файла numerical.cpp и заголовочного файла numerical.h. Перед тем как вызовом компоновки (команда цели 10_Make_Qt) будет скомпилированы все файлы, которые изменились споследней компиляции.

Создание библиотек пользователя.