Книга: Операционная система UNIX
Компиляция
Компиляция
Процедура создания большинства приложений является общей и приведена на рис. 2.2.
Рис. 2.2. Схема компиляции программы
Первой фазой является стадия компиляции, когда файлы с исходными текстами программы, включая файлы заголовков, обрабатываются компилятором cc(1). Параметры компиляции задаются либо с помощью файла makefile (или Makefile), либо явным указанием необходимых опций компилятора в командной строке. В итоге компилятор создает набор промежуточных объектных файлов. Традиционно имена созданных объектных файлов имеют суффикс ".o".
На следующей стадии эти файлы с помощью редактора связей ld(1) связываются друг с другом и с различными библиотеками, включая стандартную библиотеку по умолчанию и библиотеки, указанные пользователем в качестве параметров. При этом редактор связей может выполняться в двух режимах: статическом и динамическом, что задается соответствующими опциями. В статическом, наиболее традиционном режиме связываются все объектные модули и статические библиотеки (их имена имеют суффикс ".а"), производится разрешение всех внешних ссылок модулей и создается единый исполняемый файл, содержащий весь необходимый для выполнения код. Во втором случае, редактор связей по возможности подключает разделяемые библиотеки (имена этих библиотек имеют суффикс ".so"). В результате создается исполняемый файл, к которому в процессе запуска на выполнение будут подключены все разделяемые объекты. В обоих случаях по умолчанию создается исполняемый файл с именем a.out.
Для достаточно простых задач все фазы автоматически выполняются вызовом команды:
$ make prog
или эквивалентной ей
$ cc -о prog prog.c
которые создают исполняемый файл с именем prog. В этом случае умалчиваемое имя исполняемого файла (a.out) изменено на prog с помощью опции -о.
Впрочем, указанные стадии можно выполнять и раздельно, с использованием команд cc(1) и ld(1). Заметим, что на самом деле команда cc(1) является программной оболочкой и компилятора и редактора связей, которую и рекомендуется использовать при создании программ.
Проиллюстрируем процесс создания более сложной программы с помощью конкретных вызовов команд.
$ cc -с file1.c file2.c
$ cc -о prog
Создадим промежуточные объектные файлы file1.o и file2.o
$ cc -o prog file1.o file2.o -lnsl
Создадим исполняемый файл с именем prog, используя промежуточные объектные файлы и библиотеку libnsl.a или libnsl.so
- 3.8.3. Компиляция ядра
- Компиляция ядра
- 15.2. Компиляция для отладки
- Компиляция и установка ядра
- Компиляция вне дерева исходных кодов ядра
- Почему компиляция?
- Компиляция регулярных выражений
- Компиляция Си-программы на IBM PC (компиляторы Microsoft С и Lattice С)
- Условная компиляция
- Компиляция с библиотекой curses
- 1.2.1. Компиляция одного исходного файла
- 1.4.1. Компиляция с включением отладочной информации