PVOID - Больше примеров

Больше примеров

 Ниже приведены примеры всех трех подходов. (статические, общие и динамически загружаеые библиотеки). Файл 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


 <<< Назад Содержание Вперед >>>