Рассмотрим процесс создания программ на языках С и С++ в консоли Linux.
С помощью любого текстового редактора набираем исходный текст программы:
#include <stdio.h>
void fun(int count)
{
while(count--)
printf("Hello, world!\n");
}
int main()
{
fun(5);
return 0;
}
Сохраним текст программы в файле hello.c.
Поскольку мы использовали язык С, то выбираем компилятор GCC. Для получения объектного файла выполняем компиляцию программы:
gcc -c hello.c
В результате получим файл hello.o. После компиляции запускаем процесс компоновки:
gcc -o hello hello.o
Мы компонуем наш объектный файл с необходимым кодом стандартной библиотеки и получаем исполняемый файл hello . Его можно запустить на выпонение и увидеть результат вывода на экран строки текста.
./hello
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Компилятор С++ называется G++. Мы сохраняем текст программы в файле с расширением cc или *cpp**, и далее повторяем те же действия, что и с случае с файлом .
g++ -c hello.cpp
g++ -o hello hello.o
Оба процесса, компиляцию и компоновку можно совместить одной командой:
gcc -o hello hello.с
или
g++ -o hello hello.o
Для разработки многомодульных программ необходимо подготовить несколько исходных файлов (модулей), а затем построить программу:
gcc -o имя_программы модуль1.c модуль2.c .. модульN.c
Существует также возможность раздельной компиляции каждого модуля, с последующей компоновкой целевой программой.
Часто используемые функции помещаются в библиотеки, код которых компонуется статически или динамически с кодом программ. Мы начнем эту тему с библиотек статической компоновки.
Рассмотрим файл proba.c , содержащий определение одной функции :
int square(int value)
{
return value*value;
}
Мы компилируем этот файл и получаем proba.o.
Второй файл содержит определение функции и вызов функции :
#include <stdio.h>
int square(int value);
void fun(int count)
{
while(count--)
printf("Hello, world!\n");
}
int main()
{
fun(square(2));
return 0;
}
Скомпилируем командой:
gcc -с proba_main.с
Создадим библиотечный файл с функцией
ar cr libproba.a proba.o
Полученный файл библиотеки скомпонуем с
gcc -o proba proba_main.o -L. -lproba
Ключ -L. включает в путь поиска библиотечных файлов текущий каталог.
Рассмотрим теперь вопросы, связанные с разработкой динамических библиотек. Мы не будем менять содержимое файлов proba.c и proba_main.c.
Для начала необходимо скомпилировать файл proba.c со специальным ключом
gcc -с -fPIC proba.c
Затем мы создаем динамическую библиотеку libproba.so
gcc -shared -fPIC -o libproba.so proba.o
Компонуем программу с библиотекой:
gcc -o proba proba_main.o -L. -lproba
Файл библиотеки должен находиться в определенном месте файлового дерева. По умолчанию подразумеваются каталоги /usr/lib и /lib. Если планируется помещение библиотеки в другое место, то необходимо при компоновке указать каталог размещения:
gcc -o proba proba_main.o -L. -lproba -Wl,-rpath,/home/user/libs
Когда мы компонуем программу, подключение кода из стандартной библиотеки происходит автоматически. Но если нам нужно подключить, например, математические функции, то придется имя библиотеки указывать явно.
gcc -o mathprog mathprog.o -lm