Разработка программ на языках С и С++ в консоли

Рассмотрим процесс создания программ на языках С и С++ в консоли 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