LINUX.ORG.RU

Как проверить наличие разделяемой библиотеки из кода?

 ,


0

2

На этапе инициализации программы, нужно проверить наличие разделяемой библиотеки.

Наличие программы можно проверить так:

void program_init () {

    if (g_find_program_in_path ("program name") != NULL) {
        printf ("program name exist\n");
    }
}

Как сделать аналогичное для библиотеки?

★★★

Ответ на: комментарий от anonymous

dlopen

void program_init () {

    void *handle = dlopen ("lib_name.so", RTLD_LAZY);
    if (handle) {
        printf ("lib_name.so exist\n");
        dlclose(handle);
    }
}

А без загруки возможно?

nvl ★★★
() автор топика
Ответ на: комментарий от mittorn

Проверяй наличие файла

Где? LD_LIBRARY_PATH может и не быть. Если LD_LIBRARY_PATH нет, то где искать?

nvl ★★★
() автор топика
Ответ на: комментарий от PPP328

PATH жи

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/nick/.local/bin:/home/nick/bin

Тут нет библиотечных путей

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

А что если он другой архитектуры?

А так, если тебя устраивает наличие файла, то можно и так. Есть ещё ld.so.conf — там все пути прописаны.

a1batross ★★★★★
()
Последнее исправление: a1batross (всего исправлений: 1)
Ответ на: комментарий от nvl

Тогда dlopen(..., RTLD_LAZY) самый простой способ, хотя и не самый экономный по памяти.

a1batross ★★★★★
()
Ответ на: комментарий от PPP328

А чего его передёргивать. Никаких изменений же не было. Разве что его кэш напечатать, но я бы на него не полагался.

a1batross ★★★★★
()
Ответ на: комментарий от lberserq

Всегда можно заморочиться. И свой линкер написать.

a1batross ★★★★★
()
Ответ на: комментарий от nvl

А без загруки возможно?

А зачем? У тебя этих библиотек сотня? Просто dlopen (или какой-нибудь кроссплатформенный аналог, я вот пользуюсь QLibrary::load(), в SDL есть свой велосипед) куда надёжнее, чем просто поиск файла. Так ты дойдёшь до того, чтобы заголовок библиотеки парсить, как тут уже предлагали.

На мой взгляд, не надо умножать сложность своей программы без веских на то причин. Открытие библиотеки - достаточно надёжный способ проверки (только закрыть потом не забудь).

hobbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.