Почему имя компоновщика библиотеки только в пакете -dev?

Возьмите пакет вроде sqlite3:

http://packages.ubuntu.com/lucid/i386/libsqlite3-0/filelist
http://packages.ubuntu.com/lucid/i386/libsqlite3-dev/filelist

Обратите внимание, что имя компоновщика (/usr/lib/libsqlite3.so) появляются только в пакете -dev. Тот же шаблон действует почти для всех общих библиотек. Зачем? Разве это не смущает программы, которые пытаются динамически загружать sqlite3, используя dlopen("libsqlite3.so") когда этот файл отсутствует, если у вас нет варианта -dev?

1 ответ

libsqlite3.so файл является только символической ссылкой на полное имя файла библиотеки, libsqlite3.so.0.8.6, Во время выполнения динамический загрузчик знает только о полностью версионной библиотеке. Это верно для большинства общих библиотек. Есть некоторые библиотеки, которые не являются версионными и доступны только как libnspr4.so например. Тем не менее, такие библиотеки также упакованы правильно, в зависимости от ситуации.

Программы не должны пытаться вытолкнуть не версионную ссылку библиотеки. Если они хотят сделать это, они должны вместо этого использовать libsqlite3.so.0 Например, имя файла, которое установлено в пакете двоичной библиотеки, а не в сопровождающем пакете -dev. Таким образом, программа продолжит работать, если sqlite3 нарушает совместимость API в какой-то момент, и есть libsqlite3.so.1 вместо. С помощью libsqlite3.so.0 будет гарантировать, что программа будет использовать API библиотеки, с которой она была написана для работы.

Другие вопросы по тегам