Динамическая загрузка общих объектов с помощью dlopen () - PullRequest
5 голосов
/ 13 мая 2010

Я работаю над простым приложением X11.

По умолчанию моему приложению требуется только libX11.so и стандартный gcc C и математические библиотеки. Приложение может расширять функции с 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 / сначала вручную, чтобы увидеть, какие библиотеки у нас есть, а затем выбрать подходящий? Или у кого-нибудь есть идея получше?

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

Энди

Ответы [ 2 ]

1 голос
/ 13 мая 2010

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

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

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

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

0 голосов
/ 13 мая 2010

Из того, что я узнал, вы просто 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".

...