Чтение онлайн

на главную - закладки

Жанры

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

Самьюэл Алекс

Шрифт:
Листинг 1.1. (main.c) Исходный файл на языке С

#include <stdio.h>

#include "reciprocal.hpp"

int main(int argc, char **argv) {

 int i;

 i = atoi(argv[1]);

 printf("The reciprocal of %d is %g\n", i, reciprocal(i));

 return 0;

}

Листинг 1.2. (reciprocal.cpp)
Исходный файл на языке C++

#include <cassert>

#include "reciprocal.hpp"

double reciprocal (int i) {

 // Аргумент не должен быть равен нулю

 assert(i != 0);

 return 1.0/i;

}

Есть также файл заголовков, который называется

reciprocal.hpp
(листинг 1.3).

Листинг 1.3. (reciprocal.hpp) Файл заголовков

#ifdef __cplusplus

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
:

Поделиться:
Популярные книги

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Как я строил магическую империю 7

Зубов Константин
7. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 7

Лучший из худший 3

Дашко Дмитрий
3. Лучший из худших
Фантастика:
городское фэнтези
попаданцы
аниме
6.00
рейтинг книги
Лучший из худший 3

Штурмовик из будущего 3

Политов Дмитрий Валерьевич
3. Небо в огне
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Штурмовик из будущего 3

Последний попаданец 2

Зубов Константин
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50
рейтинг книги
Последний попаданец 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье