Программирование для Linux. Профессиональный подход | страница 9
>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