我有一个程序在启动时与一些共享库链接。主机上安装了多个版本的库。是否有一些函数或宏可以检查链接到我的程序的库版本?我想要这样的东西:
int main() {
REQUIRE_LIBRARY_VERSION_GREATER("libgcc", 1, 2, 3); //example
}
在 unix 中可能吗?我至少在linux和freebsd上需要它。
编辑:如果可能的话,我宁愿避免fork/exec。
我使用dl_iterate_phdr函数来找出加载了哪些共享对象。这是打印共享库信息的 dl 处理程序的示例
static int header_handler(struct dl_phdr_info* info, size_t size, void* data)
{
printf("name=%s (%d segments) address=%pn",
info->dlpi_name, info->dlpi_phnum, (void*)info->dlpi_addr);
for (int j = 0; j < info->dlpi_phnum; j++) {
printf("tt header %2d: address=%10pn", j,
(void*) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));
printf("ttt type=%u, flags=0x%Xn",
info->dlpi_phdr[j].p_type, info->dlpi_phdr[j].p_flags);
}
printf("n");
return 0;
}
它取自这里
它为我的视频处理项目打印如下:
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 版本。我不知道它是否对你的图书馆有好处,但它可以成为你的起点。
ldd 命令列出可执行文件的共享库
ldd <executable>