Программирование для Linux. Профессиональный подход - [5]
>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
: он включается в оба исходных файла, поэтому его изменение тоже затрагивает объектные файлы.
Помимо очевидных целевых модулей должен также существовать модуль
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.