Свързване срещу версионен .so без SONAME

Имам библиотека със затворен код, която идва във файл с име libfoo.so.1.2.3.4. objdump -p показва, че няма SONAME, но има RPATH=/usr/local/lib.

Лоша практика ли е? Трябва ли да се опитам да накарам авторите на библиотеката да променят опциите?

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

Създадох фиктивен a.c файл с празен main() и се опитвах да се свържа с gcc a.c -L. -lfoo. Проваля се. Ако създам libfoo.so -> libfoo.1.2.3.4.so символна връзка на ръка и задам export LD_LIBRARY_PATH=$(pwd), тя работи и ldd казва libfoo.so => {correct path}.

Така че донякъде работи, но това ли е препоръчителният начин?


person nponeccop    schedule 02.11.2014    source източник


Отговори (1)


Лоша практика ли е?

Не само по себе си, не. Въпреки това е вероятно авторите на библиотеката да са неосведомени, особено ако сте следвали процедурата им за инсталиране и сте завършили с libfoo.so.1.2.3.4, но без символна връзка.

Трябва ли да се опитам да накарам авторите на библиотеката да променят опциите?

Евентуално. Ненастройката SONAME и настройката RPATH не са лоши сами по себе си, но непредоставянето на символна връзка със сигурност е.

комплект export LD_LIBRARY_PATH=$(pwd)

Това като цяло е лоша идея. Трябва да предпочетете да кодирате правилното RPATH в двоичния файл (и само двоичния), който използва библиотеката. В Linux можете да постигнете това с -Wl,--rpath=$(pwd).

person Employed Russian    schedule 02.11.2014