Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
В этом упражнении вы создадите свою маленькую библиотеку, содержащую две функции, и затем используете одну из функций в примере программы. Функции называются fred и bill и просто выводят приветствия.
1. Сначала создайте отдельные исходные файлы (как не удивительно, названные fred.c и bill.c) для каждой функции.
Далее приведен первый из них:
#include <stdio.h>
void fred(int arg) {
printf("fred: you passed %dn", arg);
}
А это второй:
#include <stdio.h>
void bill(char *arg) {
printf("bill: you passed %sn", arg);
}
2. Вы можете отдельно откомпилировать эти функции и создать объектные файлы, готовые к включению в библиотеку. Для этого запустите компилятор С с опцией
-с
$ <b>gcc -с bill.с fred.c</b>
$ <b>ls *.o</b>
bill.о fred.о
3. Теперь напишите программу, вызывающую функцию
bill
<i>/*</i>
Это файл lib.h. В кем объявлены пользовательские функции fred and bill
*/<a name="read_n_1_back" href="#read_n_1" class="note">[1]</a>
void bill(char *);
void fred(int);
4. Вызывающая программа (program.с) может быть очень простой. Она включает заголовочный файл и вызов из библиотеки одной из функций.
#include <stdlib.h>
#include "lib.h"
int main() {
bill("Hello World");
exit(0);
}
5. Теперь можно откомпилировать и протестировать программу. Для этого задайте компилятору явно объектные файлы и попросите его откомпилировать ваш файл и связать его с ранее откомпилированным объектным модулем bill.o.
$ <b>gcc -с program.с</b>
$ <b>gcc -о program program.о bill.о</b>
$ <b>./program</b>
bill: we passed Hello World
$
6. Для создания архива и включения в него ваших объектных файлов используйте программу ar. Программа называется ar, поскольку она создает архивы или коллекции отдельных файлов, помещая их все в один большой файл. Имейте в виду, что программу ar можно применять для создания архивов из файлов любого типа. (Как многие утилиты UNIX, ar — универсальное средство.)
$ <b>ar crv libfоо.a bill.о fred.о</b>
а - bill.о а - fred.о
7. Библиотека создана, и в нее добавлены два объектных файла. Для того чтобы успешно применять библиотеку в некоторых системах, в особенности в производных от Berkeley UNIX, требуется создать для библиотеки индекс содержимого архива или список вложенных в библиотеку функций и переменных (table of contents). Сделайте это с помощью команды
ranlib
$ <b>ranlib libfoo.a</b>
Теперь ваша библиотека готова к использованию. Вы можете добавить следующий список файлов, которые должен обработать компилятор для создания вашей программы:
$ <b>gcc -о program program.о libfоо.а</b>
$ <b>./program</b>
bill: we passed Hello world
Можно было бы применить для доступа к библиотеке флаг
-l
-L
$ <b>gcc -о program .program.о -L. -lfoo</b>
Опция
-L
-lfoo
nm
fred
bill
bill
Если вы знакомы с разработкой программ в ОС Windows, то поймете, что в ОС UNIX существует ряд прямых аналогий, перечисленных в табл. 1.1.
Таблица 1.1
Элемент | UNIX | Windows |
---|---|---|
Объектный модуль | func.o | FUNC.OBJ |
Статическая библиотека | lib.a | LIB.LIB |
Программа | program | PROGRAM.EXE |
У статических библиотек один недостаток — когда вы запускаете много приложений одновременно и все они используют функции из одной библиотеки, в результате образуется множество копий одних и тех же функций в памяти и множество реальных копий функций в самих файлах программ. Это может привести к потреблению большого объема полезной памяти и дискового пространства.
Устранить этот недостаток могут многие системы UNIX и Linux с поддержкой совместно используемых или разделяемых библиотек. Подробное обсуждение совместно используемых библиотек и их реализации в разных ОС не входило в нашу задачу, поэтому ограничимся только реализацией их в ОС Linux.