• He разбивайте на полосы библиотеку, если только не сталкиваетесь с окружением, где пространство ограничено. Разбитые на полосы библиотеки будут функционировать, но будут иметь такие же основные недостатки, что и библиотеки, собранные из объектных файлов, скомпилированных с -fomit-frame-pointer
.
8.5. Инсталляция совместно используемых библиотек
Программа ldconfig
выполняет всю рутинную работу по инсталляции совместно используемых библиотек. Вам всего лишь нужно получить файлы и запустить ldconfig
. Выполните описанные ниже шаги.
1. Скопируйте совместно используемую библиотеку в каталог, в котором она должна быть сохранена.
2. Если нужно, чтоб компоновщик смог найти библиотеку без указания ее с помощью флажка -L
, инсталлируйте библиотеку в /usr/lib
или создайте символическую ссылку в /usr/lib
по имени
, которая указывает на файл совместно используемой библиотеки. Вы должны использовать относительную символическую ссылку (когда /usr/lib/libc.so
указывает на ../../lib/libc.so.5.3.12
), а не абсолютную (когда /usr/lib/libc.so
указывает на /lib/libc.so.5.3.12
).
3. Если нужно, чтобы компоновщик смог обнаружить библиотеку без ее инсталляции в системе (или до ее инсталляции), создайте ссылку
в текущем каталоге. Затем используйте -L.
, чтоб указать gcc
на поиск библиотек в текущем каталоге.
4. Если полный путь к каталогу, в который вы инсталлировали файл совместно используемой библиотеки, не перечислен в /etc/ld.so.conf
, добавьте его в этот файл, указав в отдельной строке.
5. Запустите программу ldconfig
, которая создаст в каталоге, где инсталлирован файл совместно используемой библиотеки, еще одну символическую ссылку из имени soname на установленный файл. Затем в кэше динамического загрузчика появится соответствующая запись. В результате динамический загрузчик сможет найти вашу библиотеку при запуске скомпонованных с нею программ, не проводя поиск ее во множестве каталогов[14].
Создавать записи в /etc/ld.so.conf
и запускать ldconfig
нужно только тогда, когда библиотеки инсталлируются в качестве системных.
8.5.1. Пример
В качестве очень простого, но все же информативного примера создадим библиотеку, содержащую одну короткую функцию. Ниже показано содержимое файла libhello.c
.
1: /* libhello.c */
2:
3: #include
4:
5: void print_hello (void) {
6: printf("Добро пожаловать в библиотеку!\n");
7: }
Разумеется, необходима программа, которая использует библиотеку libhello
.
1: / * usehello.c * /
2:
3: #include "libhello.h"
4:
5: int main(void) {
6: print_hello();
7: return 0;
8: }
Содержимое libhello.h
оставлено в качестве упражнения для самостоятельной проработки. Для того чтобы скомпилировать и воспользоваться этой библиотекой без ее инсталляции в системе, выполните перечисленные ниже шаги.
1. С использованием флажка -fPIC
соберите объектный файл совместно используемой библиотеки:
gcc -fPIC -Wall -g -с libhello.c
2. Скомпонуйте libhello
с библиотекой С для достижения лучших результатов во всех системах:
gcc -g -shared -Wl, -soname,libhello.so.0 -о libhello.so.0.0 libhello.о -lc
3. Создайте ссылку из soname на библиотеку:
ln -sf libhello.so.0.0 libhello.so.0
4. Создайте ссылку для использования компоновщиком при компиляции приложений с опцией -lhello
:
ln -sf libhello.so.0 libhello.so
5. С помощью флажка -L.
укажите компоновщику на необходимость поиска библиотек в текущем каталоге, а с помощью -lhello
определите, с какой библиотекой выполнять компоновку:
gcc -Wall -g -с usehello.c -о usehello.o
gcc -g -о usehello usehello.o -L. -lhello
(В этом случае приложение будет компоноваться, даже если вы инсталлируете библиотеку в системе вместо того, чтобы оставить ее в текущем каталоге.)
6. Теперь запустите usehello
:
LD_LIBRARY_PATH=$(pwd) ./usehello
Переменная окружения LD_LIBRARY_PATH
указывает системе места, где следует искать библиотеки (более детальная информация представлена в следующем разделе). Конечно, по желанию можно установить libhello.so.*
в /usr/lib
и избежать настройки переменной окружения LD_LIBRARY_PATH
.
8.6. Работа с совместно используемыми библиотеками