Программирование для Linux. Профессиональный подход | страница 10



Как видите, компилятор >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. Правила нам уже известны: это рассмотренные выше командные строки. А вот над зависимостями нужно немного подумать. Ясно, что файл