GCC - The Complete Reference (537669), страница 18
Текст из файла (страница 18)
Как ранее было показано в таблице 4.!, не нуждаюшийся более в предобработке исходный код на языке С сохраняется в файле с суффиксом .1. Это может быть выполнено в результате применения такой команды: 3 ясс -Е Ье11сшок1д.с -с Ье11онсг16.1 Выработка ассемблерного кода Опция -Е указывает компилятору выработать код на языке ассемблера и на этом остановиться. Следукнцая команда создаст файл с именем )те11оегок1Ц. в на ассемблерном языке текущей целевой машины из исходного файла Ье11ошог1с).
с: 3 асс -В Ье11снсе1а.с Разновидность ассемблерного языка зависит от выбора целевой платформы. При компиляции нескольких исходных файлов вырабатывается отдельный модуль ассемблерного кода для каждого из них. Создание статической библиотеки Стаглическая библиол)ека является набором файлов типа . о, вырабатываемых компилятором обычным путем. Компоновка программы с объектными модулями библиотеки — то же самое, что и компоновка ее с объектными файлами, находящимися в каталоге. Другое название статической библиотеки — архив.
Утилита, которая управляет содержимым статической библиотеки, называется ак. Для построения статической библиотеки сначала необходимо скомпилировать все объектные модули, которые должны в нее войти. К примеру, следующий исходный код программы содержится в двух файлах )те11ой1гвс. с и )те11овесопг).
с: l* Ье11ох1гвс.с */ Вглс1оае <вс61с.ц> Глава 4. Компиляция программ иа языке С 3 1 чо1о Ье11ог1гвс() ( ргапгг("тпе г1гве Ье11о1п")з /* Ье11овесопс.с «/ ()1пс1пое <вка1о.Ь> чо14 Ье11овесопп() ( рг(псе(«тье весопо ье11о1п")ю ) Два этих исходных файла могут быть скомпилированы в соответствующие им объектные файлы (с суффиксом . о) следующей командой: д дсс -с Ье11ог1гвс.с Ье11овесопо.с Для создания новой библиотеки и вставки в нее объектных файлов следует использовать утилиту аг с опцией -г. Опция -г создает указанную библиотеку, если ее еще нет, и добавляет в нее перечисленные объектные модули, при необходимости заменяя уже присутствующие модули их новыми версиями.
По следующей команде создается библиотека 11ЬЬе11о. а, содержащая два объектных модуля: 3 аг -г 11ЬЬе11о.а Ье11отьгвг.о Ье11овесопп.о Теперь библиотека вполне закончена и готова к использованию. Следующий пример программы, находящейся в файле смоье11ов.
с, вызывает обе функции из созданной библиотеки: /« ЕмоЬе11ов.с */ ЧО1С ЬЕ11О«1ГВС (ЧО16) / чо1о Ье11овесопо(чо1о) ю 1пс па1п(1пс агдс,снег «агдч!)) ( Ье11огагвк () ю Ье11овесопп()ю гегпгп(0)ю ) Программа смоье11ов может быть откомпилирована и скомпонована одной командой компилятору с указанием библиотеки в командной строке: 3 дсс сиоЬе11ов.с 11ЬЬе11о.а -о сиоье11ов Существует соглашение об именах статических библиотек: они должны начинаться с трех букв 11Ь и заканчиваться суффиксом .а.
Все системные библиотеки соответствуют этому соглашению, что позволяет использовать в командной строке сокращенную форму имен библиотек, применяя опцию -1 ("эль«). Следующая командная строка отличается от предыдущей только расположением, в котором дсс будет проводить поиск библиотеки 11ЬЬе11о. а: д дсс Сиоъе11ов.с -1Ье11о -о Еионе11ов Если указан полный путь расположения, то компилятор будет искать библиотеку только в указанном каталоге. Имя библиотеки может быть назначено как с абсо- 82 Часть(1.
Использование Сборного Компилятора лютным путем расположения (например, /пвг/мог)с11Ьв/11ЬЬе11о. а), так и относительно текущего каталога (напрнмер... /11Ь/11ЬЬе11о. а). Опция -1 не дает возможности назначить путь расположения, вместо этого она указывает компилятору искать библиотеку в стандартных каталогах расположения системных библиотек.
Создание разделяемой библиотеки Разделяемая библиолгвка (зйагед ИЬгагу) представляет собой набор объектных файлов, вырабатываемых компилятором особым образом. Все адреса (ссылки на переменные и вызовы функций) внутри объектных модулей являются относительными, а не абсолютными, что позвляет загружать и выполнять разделяемые модули динамически во время во время выполнения программы.
Для постоения разделяемой библиотеки (зйагед 1)Ьгагу) сначала необходимо особым образом скомпилировать исходные файлы объектных модулей, которые должны в нее войти. К примеру, следующий исходный код содержится в двух исходных файлах вЬе11обйгве.с и вЬе11овесопд.с; /* вЬе11ог1гвс.с */ Мьпс1ссе <всдао.Ь> то1с вЬе11ог1гвг() ( рг1псг("тЬе г1гвс Ье11о ггош а вЬаге<Г 11Ьгагухп")г ) /* вЬе11овесопд.с */ $1пс1спе <весьо.Ь> тоЫ вЬе11овесоп((О ( ргьпег("тЬе весоп<) Ье11о ггош а впагес 11Ьгагу1п")г ) Два этих исходных файла могут быть скомпилированы в объектные следующей командой: Ф дсс -с -грзс вЬе11ог1гвс.с вне11овесопс.с Опция -с указывает компилятору выработать объектные файлы. Применение опции -грйс назначает, что выходные объектные модули будут вырабатываться с использованием перемещаемой (ге)оса(аЫе) адресации.
Акроним "р(с" — сокращение от "роябоп гпдерепдеп( соде", что означает "независимый от положения код*'. Следующая команда дсс использует эти объектные файлы для построения разделяемой библиотеки Ье11о. во; ь дсс -вЬагес вЬе11огзгве.о вЬе11овесопв.о -о Ье11о.во Опция -о присваивает имя выходному файлу и при этом суффикс . во дополнительно сообщает ОСС, что объектные файлы должны быть скомпонованы в разделяемую библиотеку. Обычно компоновщик (йпйег) находит и использует функцию ша1п() как точку входа в программу, однако эти объектные модули не имеют такой Глава 4. Компиляция программ на языке С 33 точки входа, поэтому необходимо применение опции -вЬагеб, чтобы предотвратить вывод сообщения об ошибке. Компилятор распознает исходный файл программы на языке С по суффиксу .
с н он знает, как его скомпилировать в объектный файл. Благодаря этому две предыдущие команды можно объединить в одну. Исходные модули будут скомпилированы и сохранены непосредственно в разделяемой библиотеке по следущей команде: $ дес -гр1с -вьагес вЬе11ок1гвг.с вЬе11овесопе.с -о Ье11о.во Следующая программа, сохраненная в файле веиоЬе11ов. с, — образец программы, вызывающей фукции разделяемой библиотеки: /» веиоле11ов.е */ чо1с вЬе11ов1гвс(чо1П)г чо1с впе11овесопй(чола)г 1пг иа1п(1пк агдс,сЬаг «агдч[)) ( вЬе11оеагвг (); вЬе11овесопс()( гесигп(0)( Эта программа может быть скомпилирована и скомпонована с нашей разделяемой библиотекой по следующей команде; 9 дее вгиоЬе11ов.с Ье1о.во -о вгиоле11ов Теперь программа веиоЬе11ов готова к запуску. Однако, для правильного выполнения она должна быть способной находить разделяемую библиотеку Ье1о.
во, потому что во время выполнения программы необходима динамическая загрузка модулей подпрограмм, хранящихся в этой библиотеке. Информация о правилах размещения разделяемых библиотек содержится в главе 12. Замещение соглашений об именах В случае обстоятельств, требующих использования исходных файлов С с отличным от . с суффиксом имени, применяется опция -х для замещения предполагаемого по умолчанию суффикса. Эта опция применяется для указания языка. В следующем примере команды компилируется исходный код на языке С из файла ье11оиог1б. эха н создается готовая к запуску программа с именем Ье11оиог1п: $ дее -хс Ье11оиог1с.эхэ -о Ье11оиог1П Обычно, без применения опции -х, предполагается, что любой исходный файл с нераспознанным суффиксом имени известен компоновщику, и этот файл передается ему с тем же неизмененным именем.
Опция -х применяется ко всем встречающимся в командной строке именам файлов с неизвестными расширениями. Например, в следующей команде оба файла а11дп. ага и аурел. ххх обрабатываются как исходные файлы на языке С: 3 дсс -с -хе а11дп. ххх Курев.ххх 84 Часть П. Использование Сборного Компилятора Поддержка стандартов языка Используя опции командной строки, вы можете компилировать любые программы на языке С от написаных в первоначально известном синтаксисе "КдсК С" (часто сейчас называемом "традиционным С') до самых последних стандартов языка с подключением расширений бХ().
По умолчанию ССС компилирует исходный код, используя правила последнего известного стандарта с подключением всех расширений ОХ(). Доступные опции перечислены в таблице 4.2. Приложение Г содержит более детальное описание каждой из этих опций. Таблица 4.2. Опции управления применяемой версией языка С Олялв Олввавив Компилирует программы, квк соответсвующне стандартам, тек н использующие расширение ОНО. Выдает предупреждения прн любых отклонениях от строгого соответствия стандартам. Стандарт ГВО С-89. Стандарт !ВО С-99. Стандарт ГВО С-89 с расширениями ОНО н некоторыми свойствами !ВО С-99. -апв1 -редапь1с -всд св9 -есд=с99 -всд=дппе9 -ьхпд1ь1спп1 строгое соответствие правилам традиционного стандарта языка с !"КОВ с"). Наиболее фундаментальные различия между соответствующими стандарту и несоответствующими ему программами на языке С лежат в формах передачи аргументов вызываемым функциям и в присутствии или отсутствии прототипов функций.