2010-05-13 3 views
5

Я работаю над простым X11-приложением.Динамическая загрузка общих объектов с помощью dlopen()

По умолчанию для моего приложения требуется только libX11.so и стандартные gcc C и math libs. Приложение может расширить функции с помощью Xfixes, Xrender и звуковой системы ALSA. Однако эти функции (Xfixes, Xrender и ALSA) являются необязательными.

Для достижения этой цели я использую загрузку времени выполнения, то есть libXfixes, libXrender и libasound должны быть dlopen() ed.

Следовательно, приложение может функционировать в отсутствие таких библиотек.

Теперь мой вопрос:

What library names should I use when calling dlopen()? 

Я заметил, что они отличаются от дистрибутива к дистрибутиву.
Например, OpenSUSE 11, они названы следующие:

  • libXfixes.so
  • libXrender.so
  • libasound.so

В Ubuntu, однако, имена имеют номер версии, прилагаемый, например:

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

Так пытается открыть "libXfixes.so" потерпит неудачу на Ubuntu, хотя Lib, очевидно, есть. Он просто имеет номер версии прилагается. Так как мое приложение справится с этим?
Должен ли я разрешить сканирование приложения/usr/lib/first вручную, чтобы узнать, какие библиотеки у нас есть, а затем выбрать подходящий? Или у кого-то есть лучшая идея?

Спасибо, ребята,

Энди

+0

Также смотрите ответ здесь: http://stackoverflow.com/questions/15951672/loading-linux-libraries-at-runtime – AjayKumarBasuthkar

ответ

1

Вы должны использовать dlopen, используя SONAME библиотеки. Это можно увидеть, используя readelf -d [libname].

Например, на одной из моих машин Fedora Linux SONAME библиотеки C является libc.so.6.

Символьные ссылки от .so имен на имена .so.6 не гарантируются.Эти символические ссылки необходимы только для компиляции программного обеспечения и обычно не устанавливаются в системах без пакетов разработки.

В любом случае вы не захотите загружать версию с другим номером, так как число изменений указывает на основные отличия API.

+0

Большинство библиотек поддерживают обратную совместимость, что означает, что библиотека с более высоким именем должна работать. Скажем, вы пишете программу, в которой dlopens 'libc.so.6'. Затем разработчики libc делают крупное обновление и выпускают 'libc.so.7'. Теперь ваша программа будет бесполезно ломаться, потому что сонам не соответствует. –

+0

@ BjörnLindqvist: нет, большинство библиотек * не совместимы с обратной совместимостью. Откуда у вас эта идея? И если они совместимы, то они не меняют основной номер версии. GNU libc уже 6 лет. –

+0

Вы можете включить и использовать предоставленные макросы для загрузки различных общих библиотек glibc. Другие пакеты могут выполнять похожие действия, чтобы указать, какое имя библиотеки необходимо загрузить. См. «Man dlopen» для примера. –

-1

Из того, что я узнал, вы просто dlopen() (например) «libXfixes.so», который, скорее всего, является ссылкой на новый файл «libXfixes.so. 3" в любом случае, подобным образом к этому:

$ file /usr/lib/libalpm.so 
/usr/lib/libalpm.so: symbolic link to `libalpm.so.4.0.3' 

Краткий обзор моих „/ USR/Lib /“ показывает, что почти каждая библиотека там является символической ссылкой на это новейший «.X» пронумерованных файлов , и я уверен, что так оно и делается на других дистрибутивах.

Только если вам нужна конкретная версия библиотеки, вы явно указываете версию libXfixes.so.2, например.

+0

см Также ответ здесь: http://stackoverflow.com/questions/15951672/loading -linux-libraries-at-runtime – AjayKumarBasuthkar

+0

Вы никогда не должны расширять голое имя, которое предоставляется только пакетами разработки и не будет присутствовать в системе развертывания производства. –

Смежные вопросы