Стъпка 5 - Създаване на статична библиотека

libc.so.6 => /lib/libc.so.6 (0x40016000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Както виждате, всичко е правилно. Програмата използва три библиотеки:

• libc.so.6 - стандартна библиотека от езикови функции на C++ .

• ld-linux.so.2 - библиотека за динамично свързване на ELF програми.

• libfsdyn.so - нашата динамична библиотека от функции.

Тя не може да намери нашата библиотека. И с право! Динамичният линкер търси библиотеки само в директории, които познава, и директорията на нашата програма явно не му е известна.

За да добавите нашата библиотечна директория към списъка с известни директории, редактирайте файла /etc/ld.so.conf. Например моят файл се състои от следните редове:

# cat /etc/ld.so.conf/usr/X11R6/lib/usr/i386-slackware-linux/lib/usr/i386-slackware-linux-gnulibc1/lib/usr/i386-slackware-linux-gnuaout/lib дрон:

Всички използвани библиотеки се съхраняват във всички тези директории. В този списък има само една директория -/lib, която сама по себе си не се нуждае от описание, тъй като е основната. Оказва се, че нашата библиотека ще стане „забележима“, ако я поставите в една от тези директории или отделно я опишете в отделна директория. Нека да опишем за теста, добавете ред в края на файла ld.so.conf:

Разполагам с този файл в домашната директория на главния потребител, може да го имате другаде. След това динамичният линкер ще знае къде да намери нашия файл, но след промяна на конфигурационния файл ld.so.conf е необходимо системата да препрочете настройките. Това се прави от програмата ldconfig. Опитвате се да стартирате нашата програма:

# ./rezultdyn f1 () = 25

Както можете да видите, всичко работи:) Ако сега изтриете реда, който добавихме и стартирахме ldconfig отново, тогава данните за местоположението на нашата библиотека ще изчезнат и ще се появи същата грешка.

Но описаният метод засяга цялата система като цяло и изисква достъп на системния администратор, т.е. корен. И ако сте обикновен потребител без допълнителни възможности ?!

За такъв случай има и друго безболезнено решение. Това използва специалната променлива на средата LD_LIBRARY_PATH, която изброява всички директории, съдържащи персонализирани динамични библиотеки. За да зададете тази променлива в обвивката на bash, трябва само да въведете няколко команди. Първо, нека видим дали имаме такава променлива на средата:

Моят отговор е празен низ, което означава, че няма такава променлива на средата. Той се инсталира, както следва:

Тогава програмата rezultdyn ще работи добре. Ако тази променлива на околната среда вече е зададена във вашата система, за да не разваляте нейната стойност, трябва да добавите новата директория към старата стойност. Това се прави от друга команда: