Ниже приведены примеры всех трех подходов. (статические, общие и динамически загружаеые библиотеки). Файл libhello.c это обычная библиотека с libhello.h в качестве заголовка. Файл demo_use.c просто вызывает библиотеку. За ними следуют комментированные скрипты (script_static и scrypt_dynamic), показывая, как использовать библиотеку в качестве статической и общей библиотеки. Далее следует demo_dynamic.c и script_dynamic, которые показывают как использовать общие библиотеки в качестве динамически загружаемых библиотек.
Файл libhello.c
/* libhello.c - демонстрация
использования библиотеки. */
#include <stdio.h>
void hello(void) {
printf("Hello, library world.\n");
}
Файл libhello.h
/* libhello.h - демонстрация
использования библиотеки. */
void hello(void);
Файл demo_use.c
/* demo_use.c -- демонстрация непосредственного
использования процедуры "hello" */
#include "libhello.h"
int main(void) {
hello();
return 0;
}
Файл script_static
#!/bin/sh
# Пример статической библиотеки
# Создание объектного файла статической библиотеки,
# libhello-static.o. Я использую имя libhello-static,
# чтобы четко отличать примеры статических и динамических
# библиотек, но вам нет необходимости использовать "-static"
# в именах ваших объектных файлов или статических библиотек.
gcc -Wall -g -c -o libhello-static.o libhello.c
# Создание статической библиотеки.
ar rcs libhello-static.a libhello-static.o
# В этом месте мы можем просто копировать libhello-static.a
# куда-либо еще, чтобы использовать ее.
# С целью демонстрации, мы просто сохраним библиотеку
# в текущем каталоге.
# Компиляция файла программы demo_use.
gcc -Wall -g -c demo_use.c -o demo_use.o
# Создание программы demo_use; -L. добавляет директорию "." в поиск
# библиотек на время создания программы. Обратите внимение, что эта
# команда приводит к тому, что соответствующий объектный файл в
# libhello-static.a включается в файл demo_use_static.
gcc -g -o demo_use_static demo_use.o -L. -lhello-static
# Запуск программы.
./demo_use_static
Файл script_shared
#!/bin/sh
# Пример общей библиотеки
# Создание объектного файла общей библиотеки, libhello.o.
gcc -fPIC -Wall -g -c libhello.c
# Создание общей библиотеки.
# Используем -lc для компоновки с библиотекой C,
# т.к. libhello зависит от библиотеки C.
gcc -g -shared -Wl,-soname,libhello.so.0 \
-o libhello.so.0.0 libhello.o -lc
# Здесь мы можем просто скопировать libhello.so.0.0
# в любую директорию, например /usr/local/lib.
# Теперь нам нужно вызвать ldconfig
# для настройки символических ссылок.
# Настройка soname. Мы можем просто выполнить:
# ln -sf libhello.so.0.0 libhello.so.0
# но давайте позволим ldconfig разобраться с этим.
/sbin/ldconfig -n .
# Настройка имени для компоновщика.
# В более сложных условиях, нам необходимо убедиться,
# имеется ли существующее имя для компоновщика, и если
# это так, проверить, должно ли оно остаться или нет.
ln -sf libhello.so.0 libhello.so
# Компиляция файла программы demo_use.
gcc -Wall -g -c demo_use.c -o demo_use.o
# Создание программы demo_use.
# -L. добавляет директорию "." в поиск
# библиотек на время создания программы;
# заметьте, что это не означает, что "."
# будет находиться в списке директорий для поиска
# библиотек во время исполнения.
gcc -g -o demo_use demo_use.o -L. -lhello
# Исполнение программы. Обратите внимание,
# что нам необходимо сказать программе, где
# находится общая библиотека, используя LD_LIBRARY_PATH.
LD_LIBRARY_PATH="." ./demo_use
Файл demo_dynamic.c
/* demo_dynamic.c -- демонстрирует динамическую
загрузку и использование процедуры "hello" */
/* dlfcn.h требуется для процедур,
динамически загружающих библиотеку */
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
/* Обратите внимание, что мы не должны включать "libhello.h".
Однако, нам необходимо указать нечто похожее;
мы должны указать тип, который будет хранить значение,
которое мы собираемся получить из dlsym(). */
/* Тип "simple_demo_function" описывает функцию, которая
не принимает аргументов и не возвращает значения: */
typedef void (*simple_demo_function)(void);
int main(void) {
const char *error;
void *module;
simple_demo_function demo_function;
/* Загрузка линамически загружаемой библиотеки */
module = dlopen("libhello.so", RTLD_LAZY);
if (!module) {
fprintf(stderr, "Couldn't open libhello.so: %s\n",
dlerror());
exit(1);
}
/* Получение символа */
dlerror();
demo_function = dlsym(module, "hello");
if ((error = dlerror())) {
fprintf(stderr, "Couldn't find hello: %s\n", error);
exit(1);
}
/* Вызов функции из DL библиотеки */
(*demo_function)();
/* Все сделано, закрываем библиотеку */
dlclose(module);
return 0;
}
Файл script_dynamic
#!/bin/sh
# Пример динамически загружаемой библиотеки
# Предполагаем, что libhello.so и другие необходимые файлы
# уже созданы (смотрите пример динамически загружаемой библиотеки).
# Компиляция программы demo_dynamic в объектный файл.
gcc -Wall -g -c demo_dynamic.c
# Создание программы demo_use.
# Обратите внимание, что нам не нужно указывать,
# где искать DL библиотеки, так как единственная специальная
# библиотека, используемая программой, не будет загружена до
# запуска программы. Однако, нам необходима опция -ldl,
# чтобы включить библиотеку, которая загружает DL библиотеки.
gcc -g -o demo_dynamic demo_dynamic.o -ldl
# Запуск программы. Обратите внимание,
# что нам необходимо сказать программе, где
# находится общая библиотека, используя LD_LIBRARY_PATH.
LD_LIBRARY_PATH="." ./demo_dynamic
Этот раздел является переводом руководства Program Library HOWTO
<<< Назад | Содержание | Вперед >>> |