Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_1_5_Базовые инструментальные средства.doc
Скачиваний:
4
Добавлен:
21.09.2019
Размер:
94.72 Кб
Скачать

8

СПО часть 1 Лек 1_5 (Кузнецова А.В.)

Базовые инструментальные средства Linux Компилятор gcc

gcc - это свободно доступный оптимизирующий компилятор для языков C, C++, Ada 95, а также Objective C. Его версии применяются для различных реализаций Unix (а также VMS, OS/2 и других систем PC), и позволяют генерировать код для множества процессоров.

gcc можно использовать и для компиляции программ в объектные модули, и для компоновки полученных модулей в единую исполняемую программу. Компилятор способен анализировать имена файлов, передаваемые ему в качестве аргументов, и определять, какие действия необходимо выполнить. Файлы с именами типа name.cc (или name.C) рассматриваются, как файлы на языке C++, а файлы вида name.o считаются объектными (т.е. внутримашинным представлением).

Чтобы (только) откомпилировать исходный код C, находящийся в файле F, и создать объектный файл F.o, следует выполнить команду:

gcc -c F

Чтобы скомпоновать один или несколько объектных файлов, полученных из исходного кода C - F1.o, F2.o, ... ‑ в единый исполняемый файл F, следует использовать команду:

gcc -o F F1.o F2.o ... <other-libraries>

Здесь строка other-libraries - означает подключение при компоновке дополнительных разделяемых библиотек.

Можно совместить два этапа обработки ‑ компиляцию и компоновку ‑ в один общий этап с помощью команды:

gcc -o F F1.cc ... -lg++ <other-libraries>

После компоновки будет создан исполняемый файл F, который можно запустить с помощью команды:

./F <arguments>,

где строка arguments определяет аргументы командной строки программы F.

Заголовочные файлы, используемые gcc компилятором, находятся в директории /usr/include/g++, а библиотеки расположены в /usr/lib. Сам компилятор по умолчанию устанавливается в директорию /usr/bin.

Справочная информация

Среди множества опций компиляции и компоновки наиболее часто употребляются следующие:

-c

Только компиляция. Из исходных файлов программы создаются объектные файлы в виде name.o. Компоновка не производится.

-Dname=value

Определить имя name в компилируемой программе как значение value. Эффект такой же, как наличие строки

#define name value

в начале программы. Часть `=value' может быть опущена, в этом случае значение по умолчанию равно 1.

-o file-name

Использовать file-name в качестве имени для создаваемого gcc файла (обычно это исполняемый файл).

-llibrary-name

Использовать при компоновке указанную библиотеку.

-g

Поместить в объектный или исполняемый файл отладочную информацию для отладчика gdb. Опция должна быть указана и для компиляции, и для компоновки.

-MM

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

-pg

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

-Wall

Вывод сообщений о всех предупреждениях или ошибках, возникающих во время трансляции программы.

-O1

Устанавливает оптимизацию уровня 1. Оптимизированная трансляции требует несколько больше времени и несколько больше памяти для больших функций. Без указания опций `-O' цель компилятора состоит в том, чтобы уменьшить стоимость трансляции и выдать ожидаемые результаты при отладке. Операторы независимы: если вы останавливаете программу на контрольной точке между операторами, то можете назначить новое значение любой переменной или поставить счетчик команд на любой другой оператор в функции и получить точно такие результаты, которые вы ожидали от исходного текста. С указанием `-O' компилятор пробует уменьшить размер кода и время исполнения.

-O2

Устанавливает оптимизацию уровня 2. GNU CC выполняет почти все поддерживаемые оптимизации, которые не включают уменьшение времени исполнения за счет увеличения длины кода. Компилятор не выполняет раскрутку циклов или подстановку функций, когда вы указываете `-O2'. По сравнения с `-O' эта опция увеличивает как время компиляции, так и эффективность сгенерированного кода.

-O3

Устанавливает оптимизацию уровня 3. `-O3' включает все оптимизации, определяемые `-O2', а также включает опцию `inline-functions'.

-O0

Без оптимизации. Если вы используете многочисленные `-O' опции с номерами или без номеров уровня, действительной является последняя такая опция.

Библиотеки

Язык C не предоставляет встроенных возможностей для выполнения таких распространенных операций, как ввод/вывод, управление памятью, работа со строками, и т.п. Эти возможности определены в стандартной библиотеке, которая компонуется в вашу программу.

Библиотекой называют набор объектных файлов, сгруппированных в единый файл и проиндексированных. Когда команда компоновки обнаруживает некоторую библиотеку в списке объектных файлов для компоновки, она проверяет, содержат ли уже скомпонованные объектные файлы вызовы для функций, определенных в одном из файлов библиотек. Если такие функции найдены, соответствующие вызовы связываются с кодом объектного файла из библиотеки.

Библиотеки обычно определяются через аргументы вида -llibrary-name. В частности, -lg++ означает библиотеку стандартных функций C++, а -lm определяет библиотеку различных математических функций (sin, cos, arctan, sqrt, и т.д.). Библиотеки должны быть перечислены после исходных или объектных файлов, содержащих вызовы к соответствующим функциям.

Библиотека GNU C определяет все библиотечные функции, определенные стандартом ISO C и дополнительные возможности, указанные в стандарте POSIX и иных предписаниях для операционных систем Unix, а также расширения, специфичные для систем GNU. Она является наиболее фундаментальной системной библиотекой и обязательно присутствует в любой системе Linux.

В составе библиотеки можно выделить следующие основные группы функций:

  • Сообщения об ошибке - описывает способы определения и сообщения об ошибках.

  • Языковые возможности - содержит информацию о поддержке библиотекой стандартных частей языка C, включая оператор `sizeof' и символическую константу `NULL', функции с переменным числом аргументов и константы, определяющие пределы и другие свойства для числовых типов. Содержит также простейший механизм отладки, позволяющий помещать в код диагностирующие макросы.

  • Управление памятью - описывает возможности управления реальной и виртуальной памятью, включая динамическое распределение. Если вы не уверены в требуемом количестве памяти для объектов программы, вы можете выделить ее динамически и работать с ней через указатели.

  • Работа с символами - содержит информацию о функциях классификации символов (например, `isspace') и функциях преобразования типа для символов.

  • Работа со строками и массивами - описывает функции работы со строками (массивами символов, заканчивающимися 0) и обычными байтовыми массивами, включая операции копирования и сравнения.

  • Общий ввод/вывод - дает общее представление о возможностях библиотеки по вводу/выводу и содержит информацию о базовых концепциях, например, об именах файлов.

  • Ввод/вывод через потоки - описывает операции ввода / вывода с использованием потоков (или объектов `FILE *'). Здесь находятся функции библиотеки C, указанные в `stdio.h'.

  • Низкоуровневый ввод/вывод - содержит информацию о вводе/выводе через дескрипторы файлов. Механизм файловых дескрипторов является низкоуровневым и специфичен для систем семейства Unix.

  • Интерфейс файловой системы - описывает операции над целыми файлами, например, функции удаления и переименования, а также создания каталогов. Содержит информацию о доступе к атрибутам файла, например, к имени владельца и правам доступа.

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

  • Сокеты - более сложный механизм межпроцессного взаимодействия, позволяющий процессам на разных компьютерах общаться через сеть. Содержит информацию о способах адресации Internet и использовании баз данных сети.

  • Низкоуровневый интерфейс с терминалом - описывает способы изменения атрибутов терминального устройства.

  • Математика - содержит информацию о математических функциях библиотеки. Они включают в себя генератор случайных чисел, функции деления с остатком, тригонометрические и экспоненциальные функции над числами с плавающей запятой.

  • Низкоуровневая арифметика - описывает функции простой арифметики, анализа величин с плавающей точкой, а также чтения чисел из строк.

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

  • Совпадение с образцом - предоставляет функции для проверки текста на совпадение с регулярными выражениями или образцами имени файла.

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

  • Работа с кодировкой - содержит информацию о работе с различными символами и строками, состоящими из символов, не входящих в стандартный набор типа `char'.

  • Работа с локалью - описывает выбор определенной страны или языка, влияющий на поведение функций библиотеки. Например, локаль влияет на формат денежных величин.

  • Нелокальные переходы - поясняет работу с функциями `setjmp' и `longjmp'. Эти функции предоставляют возможности безусловного перехода из одной функции в другую.

  • Обработка сигналов - описывает механизм сигналов, способы установки обработчиков, реагирующих на сигналы определенного вида, способы запрета реакции на сигналы в критических секциях программы.

  • Базовые функции программы - содержатся функции доступа к аргументам командной строки и переменным окружения.

  • Процессы - описание функций запуска новых процессов и программ.

  • Управление заданиями - содержит функции для управления группами процессов и терминалом. Эти функции полезны, если вы разрабатываете собственную оболочку или программу, которая управляет заданиями самостоятельно.

  • Сервис поиска имен - описывает сервис для поиска имен в системных базах данных, определяет сервис, доступный для базы данных, а также способы его реализации, позволяя разработку собственных сервисов.

  • Базы данных пользователей и групп - разъясняются способы доступа к соответствующим базам системы.

  • Управление системой - содержит функции для получения информации о конфигурации системы - как программной, так и аппаратной.

Конфигурация системы - функции для получения информации о системных