在运行时检查动态库的兼容性

时间:2012-12-03 13:55:22

标签: c++ linux dlopen

我正在开发一个C ++应用程序,它需要在运行时使用dlopen加载动态库。这个图书馆通常不会由我写。

人们建议采用什么方法来确保此库与我的应用程序之间的二进制兼容性?

我看到的选项是:

  1. 将版本号放在库文件名中,并尝试加载它(通过符号链接),无论如何。如果dlopen失败,则报告错误。

  2. 维护第二个返回版本号的界面。但是,如果此界面由于某种原因而发生变化,我们会遇到与以前相同的问题。

  3. 还有其他选择吗?

3 个答案:

答案 0 :(得分:3)

您应该定义关于动态加载(即dlopen - ed)库的约定。

您可能有这样的约定:库需要提供const char mylib_version_str[];符号,该符号提供API等的版本等。当然,您可以使用自己的预处理器技巧来帮助解决此问题。

为了您的灵感,您可以从plugins(例如plugin_is_GPL_compatible符号)查看GCC要求的内容。

如果动态加载的库是C ++,您可以使用demangling来检查函数的签名....

答案 1 :(得分:1)

为什么不使用这两个选项?通过很少的库已经做到了(Lua例如,旧的dll是Lua51.dll,那么你有Lua52等,你也可以查询它的版本。)

一个好的界面可以改变,但不常见,为什么要使用2个简单的静态方法

const char* getLibraryName();
uint32 getLibraryVersion();

改变加班时间?

答案 2 :(得分:1)

如果您/他们使用libtool构建库/应用程序,您可以这样推荐:http://www.gnu.org/software/libtool/manual/libtool.html#Versioning