我需要使用 dlopen 加载预安装的共享对象。说它有名字 somelib.so
在某些系统上,有几个链接的库:somelib.so、somelib.so.1、somelib.so.321.1
在其他系统上只有没有链接的库:somelib.so.321.1 如何正确加载这个库?
我使用名称“somelib.so”执行 dlopen,这仅适用于存在此链接的系统。
如果系统中不存在默认链接('somelib.so'),是否是搜索库全名的唯一选项?
最佳答案
这取决于上下文:旨在通过 dlopen 加载的插件通常没有版本号,例如 /usr/libexec/apache2/mod_something.so
。
普通共享库通常有以下版本:
libfoo.so.Majorversion.Minoversion
libfoo.so.Majorversion
libfoo so
Minorversion 部分可以更改,恕不另行通知,这意味着兼容 更改。如果 Majorversion 部分发生变化,则它(可能)是一个不兼容 的变化。所以我建议你在 dlopen 中使用第二个版本,例如 libz.so.1
而不是 libz.so
或 libz.so.1.2.11
.
(为了更难,Majorversion和Minorversion都可以结构化,例如Major='1.1' Minor='1.a')
关于c++ - 如何加载带有后缀的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54060316/