2014-01-16 2 views
0

У меня есть программа, которая связана с какой-либо разделяемой библиотекой при запуске. На хосте есть несколько версий библиотеки. Есть ли какая-то функция или макрос, который может проверить версию библиотеки, которая была связана с моей программой? Я хочу что-то вроде этого:Как проверить версию общей библиотеки в двоичном файле

int main() { 
    REQUIRE_LIBRARY_VERSION_GREATER("libgcc", 1, 2, 3); //example 
} 

Возможно ли это в unix? Мне это нужно, по крайней мере, на linux и freebsd.

EDIT: Я бы предпочел избегать fork/exec, если это возможно.

ответ

1

dl_iterate_phdr Я использую функцию, чтобы выяснить, какие общие объекты загружаются. Это пример обработчика дл, который печатает совместно ЛИЭС Информация

static int header_handler(struct dl_phdr_info* info, size_t size, void* data) 
{ 
    printf("name=%s (%d segments) address=%p\n", 
      info->dlpi_name, info->dlpi_phnum, (void*)info->dlpi_addr); 
    for (int j = 0; j < info->dlpi_phnum; j++) { 
     printf("\t\t header %2d: address=%10p\n", j, 
      (void*) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr)); 
     printf("\t\t\t type=%u, flags=0x%X\n", 
       info->dlpi_phdr[j].p_type, info->dlpi_phdr[j].p_flags); 
    } 
    printf("\n"); 
    return 0; 
} 

Он взят из here

Он печатает для моего проекта обработки видео следующее:

name=/usr/local/lib/libopencv_highgui.so.2.4 (7 segments) address=0x7f467935a000 
name=/usr/local/lib/libopencv_imgproc.so.2.4 (7 segments) address=0x7f46796e9000 
... 

OpenCV включает версию в названии библиотеки libopencv_imgproc.so * .2.4 *. Таким образом, я знаю, что версия opencv загружена. Я не знаю, хорошо ли это для ваших библиотек, но это может быть отправной точкой для ваших.

+0

Похоже, это может сработать. Я даю ему попробовать, спасибо! –

0

Список команд LDD разделяемые библиотеки для исполняемого файла

ldd <executable> 
+1

Спасибо за ваш ответ, но мне нужна какая-то функция или макрос для вызова из моей программы, а не из консоли. –

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