Марк Митчелл - Программирование для Linux. Профессиональный подход
- Название:Программирование для Linux. Профессиональный подход
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2002
- Город:Москва
- ISBN:5-8459-0243-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание
Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.
Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
extern "С" {
#endif
extern double reciprocal(int i);
#ifdef __cplusplus
}
#endif
Первый шаг заключается в превращении исходных файлов в объектный код.
1.2.1. Компиляция одного исходного файла
Компилятор языка С называется gcc
. При компиляции исходного файла нужно указывать опцию -с
. Вот как, например, в режиме командной строки компилируется файл main.с
:
% gcc -с main.с
Полученный объектный файл будет называться main.o
.
Компилятор языка C++ называется g++
. Он работает почти так же, как и gcc
. Следующая команда предназначена для компиляции файла reciprocal.cpp
:
% g++ -c reciprocal.cpp
Опция -с
говорит компилятору о необходимости получить на выходе объектный файл (он будет называться reciprocal.o
). Без неё компилятор g++
попытается скомпоновать программу и создать исполняемый файл.
В процессе написания любой более-менее крупной программы обычно задействуется ряд дополнительных опций. К примеру, опция -I
сообщает компилятору о том, где искать файлы заголовков. По умолчанию компиляторы GCC просматривают текущий каталог, а также каталоги, где установлены файлы стандартных библиотек. Предположим, наш проект состоит из двух каталогов: src
и include
. Следующая команда даст компилятору g++
указание дополнительно искать файл reciprocal.hpp
в каталоге ../include
:
% g++ -с -I ../include reciprocal.cpp
Иногда требуется задать макроконстанты в командной строке. Например, в коммерческой версии программы нет необходимости осуществлять избыточную проверку утверждения в файле reciprocal.cpp
; она нужна лишь в целях отладки. Эта проверка отключается путем определения макроконстанты NDEBUG
. Можно, конечно, явно добавить в файл директиву #define
, но это означает изменение исходного текста программы. Проще сделать то же самое в командной строке:
% g++ -c -D NDEBUG reciprocal.cpp
Аналогичным образом можно задать конкретный уровень отладки:
% g++ -с -D NDEBUG=3 reciprocal.cpp
При написании коммерческих программ оказываются полезными средства оптимизации кода, имеющиеся в компиляторах GCC. Есть несколько уровней оптимизации; для большинства программ подходит второй. Следующая команда компилирует файл reciprocal.cpp
с включенным режимом оптимизации второго уровня:
% g++ -с -O2 reciprocal.cpp
Учтите, что средства оптимизации усложняют отладку программы. Кроме того, бывают случаи, когда наличие оптимизации приводит к проявлению скрытых ошибок, незаметных ранее.
Компиляторы gcc
и g++
принимают множество различных опций. Получить их полный список можно в интерактивной документации. Для этого введите следующую команду:
% info gcc
1.2.2. Компоновка объектных файлов
После того как файлы main.c
и reciprocal.cpp
скомпилированы, необходимо скомпоновать их. Если в проект входит хотя бы один файл C++, компоновка всегда осуществляется с помощью компилятора g++
. Если же все файлы написаны на языке С, нужно использовать компилятор gcc
. В нашем случае имеются файлы обоих типов, поэтому требуемая команда выглядит так:
% g++ -о reciprocal main.o reciprocal.o
Опция -о задает имя файла, создаваемого в процессе компоновки. Теперь можно осуществить запуск программы reciprocal
:
% ./reciprocal 7
The reciprocal of 7 is 0.142857
Как видите, компилятор g++
автоматически подключил к проекту стандартную библиотеку языка С, содержащую реализацию функции printf()
. Для компоновки дополнительных библиотек (например, модуля функций графического интерфейса пользователя) необходимо воспользоваться опцией -l
. В Linux имена библиотек почти всегда начинаются с префикса lib
. Например, файл подключаемого модуля аутентификации (Pluggable Authentication Module, РАМ) называется libpam.a
. Чтобы скомпоновать его с имеющимися файлами, введите такую команду:
% g++ -о reciprocal main.o reciprocal.o -lpam
Компилятор автоматически добавит к имени библиотеки префикс lib
и суффикс .a
.
Как и в случае с файлами заголовков, компилятор ищет библиотечные файлы в стандартных каталогах, в частности /lib
и /usr/lib
. Для задания дополнительных каталогов предназначена опция -L
, которая аналогична рассматривавшейся выше опции -I
. Следующая команда сообщает компоновщику о том, что поиск библиотечных файлов нужно осуществлять прежде всего в каталоге /usr/local/lib/pam
:
% g++ -o reciprocal main.o reciprocal.o -L/usr/local/lib/pam -lpam
В отличие от препроцессора, автоматически ведущего поиск файлов заголовков в текущем каталоге, компоновщик просматривает лишь стандартные каталоги. Поэтому, если библиотечный файл находится в текущем каталоге, об этом нужно сообщить явно с помощью опции -L
. Например, после выполнения следующей команды компоновщик будет искать в текущем каталоге библиотеку test
:
% gcc -o app app.o -L. -ltest
1.3. Автоматизация процесса с помощью GNU-утилиты make
Те, кто программируют в Windows, привыкли работать в той или иной интегрированной среде разработки. Программист добавляет в нее исходные файлы, а среда автоматически создает проект. Аналогичные среды доступны и в Linux, но мы не будем рассматривать их. Вместо этого мы научим читателей работать с GNU-утилитой make
, знакомой большинству Linux-программистов. Она позволяет автоматически перекомпилировать программу.
Основная идея утилиты make
проста. Ей указываются целевые модули , участвующие в процессе построения исполняемого файла, и правила , по которым протекает этот процесс. Также задаются зависимости , определяющие, когда конкретный целевой модуль должен быть перестроен.
В нашем тестовом проекте reciprocal
три очевидных целевых модуля: reciprocal.o
, main.o
и сама программа reciprocal
. Правила нам уже известны: это рассмотренные выше командные строки. А вот над зависимостями нужно немного подумать. Ясно, что файл reciprocal
зависит от файлов reciprocal.o
и main.o
, поскольку нельзя скомпоновать программу, не создав оба объектных файла. Последние должны перестраиваться при изменении соответствующих исходных файлов. Нельзя также забывать о файле reciprocal.hpp
: он включается в оба исходных файла, поэтому его изменение тоже затрагивает объектные файлы.
Помимо очевидных целевых модулей должен также существовать модуль clean
. Он предназначен для удаления всех сгенерированных объектных файлов и программ, чтобы можно было начать все сначала. Правило для данного модуля включает команду rm
, удаляющую перечисленные файлы.
Чтобы передать всю эту информацию утилите make
, необходимо создать файл Makefile
. Его содержимое будет таким:
Интервал:
Закладка: