Стъпка 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 ще работи добре. Ако тази променлива на околната среда вече е зададена във вашата система, за да не разваляте нейната стойност, трябва да добавите новата директория към старата стойност. Това се прави от друга команда: