С.В. Герасимов, И.В. Машечкин, М.И. Петровский и др. - Инструментальные средства разработки ПО в ОС UNIX, страница 2
Описание файла
PDF-файл из архива "С.В. Герасимов, И.В. Машечкин, М.И. Петровский и др. - Инструментальные средства разработки ПО в ОС UNIX", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
Какиеоперации необходимо выполнить с файлами – зависит от суффиксаимен файлов. Возможные суффиксы перечислены в таблице ниже.Если имя файла имеет нераспознанный суффикс, это имя передаётсякомпоновщику.Суффикс именифайлаВыполняемые действия.hЗаголовочный файл на языке Си. Не должениспользоваться в аргументах команды gcc.Попытка трансляции такого файла вызываетсообщение об ошибке..cФайлнаязыкеСи.препроцессирование,ассемблирование и компоновка..iПрепроцессированный файл на языке Си.Выполняется трансляция, ассемблирование икомпоновка..sФайл на языке ассемблера.ассемблирование и компоновка..SФайл на языке ассемблера.
Выполняетсяпрепроцессирование,ассемблированиеикомпоновка..oОбъектный файл. Выполняется компоновка..aФайл статической библиотеки. Выполняетсякомпоновка.Выполняетсятрансляция,ВыполняетсяДействия по трансляции файла определяются для каждогоуказанного в командной строке файла индивидуально. Например,если в командной строке указаны имена файлов 1.c и 2.o, то дляпервого файла будут выполнены все шаги трансляции, а для второго– только компоновка.
Исполняемый файл будет содержать результаттрансляции первого файла, скомпонованный со вторым файлом истандартными библиотеками.8Пользователь может явно задать, на какой фазе нужноостановиться. По умолчанию транслятор пытается выполнить всенеобходимые фазы, включая компоновку программы. Конечная фазатрансляции программы определяется для всех транслируемых заодин вызов gcc файлов указанием одной из опций, перечисленных втаблице.ОпцияОписание-EОстановитьсяпослепрепроцессирования.Результат работы препроцессора выводится поумолчанию на стандартный поток вывода. Имявыходного файла можно указать с помощьюопции -o. При этом если в командной строкеуказано несколько файлов, то в выходной файлбудет помещён результат препроцессированияпоследнего файла.-SОстановиться после трансляции в ассемблер.
Поумолчанию имя выходного файла получается изимени входного файла заменой суффикса .c или.i на суффикс .s. Явное имя выходного файламожно указать с помощью опции -o. Попыткаиспользования опции -o и нескольких имёнвходных файлов вызывает сообщение об ошибке.-cОстановиться после ассемблирования. Поумолчанию имя выходного файла получается изимени входного файла заменой суффикса егоимени на суффикс .o.
Явное имя выходногофайла можно указать с помощью опции -o,которая несовместима с указанием одновременнонескольких транслируемых файлов.Если ни одной из перечисленных выше опций незадано, выполняются все стадии трансляции.Имя выходного файла по умолчанию равно a.out,но может быть изменено с помощью опции -o.Позволяет задать явное имя выходного файла длялюбой стадии трансляции.-oНапример, командная строкаgcc 1.c 2.c -o 19транслирует два файла на языке Си, объединяя их в одну программус именем 1.Командная строкаgcc 3.o 4.o -o 3 -lmкомпонует два объектных файла, добавляя к ним стандартнуюбиблиотеку языка Си и стандартную математическую библиотеку(опция -lm), и помещает результат в исполняемый файл с именем 3.Прочие полезные опции транслятора gcc перечислены втаблице.ОпцияОписание-I PATHДобавляет каталог PATH в начало спискакаталогов,которыепросматриваютсяпрепроцессоромприпоискефайлов,подключаемыхдирективой#include.Вкомандной строке может быть указано несколькоопций -I, тогда каталоги просматриваются впорядке, в котором они указаны в команднойстроке.-D NAMEОпределяет макрос с именем NAME, которыйполучает значение 1.-DNAME=VALUEОпределяет макрос с именем NAME, которыйполучает заданное значение VALUE.-WallВключаетвыдачубольшогоколичествапредупреждающих сообщений, которые поумолчанию не выдаются.
Опция должнаиспользоваться при компиляции программ, всепредупреждающие сообщения компиляторадолжны быть внимательно проанализированы,поскольку могут указывать на ошибки впрограмме.-gВключает генерацию отладочной информации висполняемую программу. Наличие отладочнойинформации позволяет отлаживать программу втерминах исходного языка, а не машинного кода.-O2Включаетбольшинствооптимизацийпрограммы, которые одновременно уменьшаютразмер программы и увеличивают скорость её10выполнения.-L PATHДобавляет путь PATH в начало списка каталогов,которые просматриваются редактором связейпри поиске библиотек, указанных с помощьюопции -L. Если в командной строке указанонесколько опций -L, они добавляются в том жепорядке, в котором указаны в командной строке.-lnameДобавляет библиотеку name к списку библиотек,которые участвуют в компоновке программы(обратите внимание на отсутствие пробеламежду опцией и именем библиотеки). Всистемах Unix редактор связей просматриваетбиблиотеки один раз, поэтому неправильныйпорядок задания библиотек может привести ктому,чтонекоторыеименаостанутсянеопределёнными, и компиляция завершится сошибкой.
Файл, хранящий библиотеку с именемname, называется libname.a, если библиотекастатическая, и libname.so, если библиотекадинамическая.-staticУказывает, что при компоновке не должныиспользоватьсядинамическиебиблиотеки.Реализации всех используемых в программефункций будут добавлены непосредственно висполняемый файл. Размер исполняемого файлапрограммы может вырасти на сотни килобайт,зато такая программа перестанет быть зависимойот динамических библиотек. На некоторыхсистемах могут отлаживаться только статическискомпонованные программы.Использование стандартных библиотек языка СиВ языках Си и Си++ библиотеки состоят из двух частей:Заголовочных файлов, содержащих объявления типов данных,констант, прототипов функций и внешних переменных,которые подключаются к исходным файлам на этапепрепроцессирования, формируя единицы трансляции.Файлов реализации, содержащих тела функций и определенияпеременных, которые подключаются к программе на этапе11компоновки (в случае статических библиотек) или на этапевыполнения (в случае динамических библиотек).Заголовочные файлы стандартной библиотеки находятся в каталоге/usr/include и его подкаталогах, например, /usr/include/stdio.h или/usr/include/sys/types.h.
Программа-драйвер gcc автоматическидобавляет этот каталог в список для поиска заголовочных файлов,поэтому каталог /usr/include не нужно задавать в опции –I.Файлы динамических библиотек размещаются в каталоге /lib или/usr/lib, а файлы статических библиотек – в каталоге /usr/lib. Онизадаются автоматически и опция –L для них не нужна. Файлдинамической библиотеки языка Си называется libc.so и полныйпуть к нему – /lib/libc.so.Таким образом, если выписать явно пути и библиотеки, задаваемыепри компиляции программы на Си с помощью gcc неявно, мыполучим примерно следующую командную строку:gcc -I/usr/include -L/lib -L/usr/lib jeltz.c –lcИсключением являются математические функции стандартнойбиблиотеки Си, объявленные в заголовочном файле <math.h>,например, sin.
Их реализации вынесены в отдельную библиотекуlibm.so (libm.a), которая не указывается в списке подключаемыхбиблиотекпоумолчанию.Длякомпоновкипрограмм,использующих математические функции, необходимо в команднойстроке gcc указать опцию -lm:gcc -Wall -O2 marvin.c -omarvin –lmДля того, чтобы увидеть все пути, передаваемые драйверомкомпиляции gcc препроцессору, компилятору, ассемблеру икомпоновщику, можно использовать опцию –v:gcc -g -O0 -v prosser.c -o prosserКомпоновка программыЕсли исполняемая программа компонуется из несколькихединиц трансляции, компоновщик использует свои правилавидимости имён, которые приведены ниже:12Все имена, объявленные с классом памяти static, видимытолько в пределах своей единицы трансляции и не влияют накомпоновку.Если некоторая единица трансляции использует внешнее имя(переменной или функции), которое не определено ни в какойединице трансляции, выдаётся сообщение об ошибке.Еслинесколькоедиництрансляцииопределяютнестатическую функцию с одним и тем же именем, выдаётсясообщение об ошибке.Если некоторое нестатическое имя определяется и какпеременная, и как функция, выдаётся сообщение об ошибке.Еслинесколькоедиництрансляцииопределяютнестатическую инициализированную переменную с одним итем же именем, выдаётся сообщение об ошибке.Если несколько единиц трансляции определяют переменную содним и тем же именем, которая инициализируется не болеечем в одной единице трансляции, все определенияразмещаются, начиная с одного адреса.Последнее правило можно продемонстрировать на следующемпримере.