1

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

人们推荐什么方法来确保这个库和我的应用程序之间的未来二进制兼容性?

我看到的选项是:

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

  2. 维护返回版本号的第二个接口。但是,如果这个界面由于某种原因发生了变化,我们会遇到和以前一样的问题。

还有其他选择吗?

4

3 回答 3

3

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

您可能有一个约定,即要求库提供一个const char mylib_version_str[];符号,该符号给出 API 的版本等。当然,您可以有自己的预处理器技巧来帮助解决这个问题。

为了您的灵感,您可以查看 GCC 对插件的要求(例如plugin_is_GPL_compatible符号)。

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

于 2012-12-03T14:07:29.803 回答
1

为什么不同时使用这两个选项?就目前而言,很少有库已经这样做了(例如 Lua,旧的 dll 是 Lua51.dll,然后你有 Lua52 等。你也可以查询它的版本。)

一个好的接口可以改变,但不是那么频繁,为什么要2个简单的静态方法

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

随着时间的推移而变化?

于 2012-12-03T14:08:25.487 回答
1

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

于 2012-12-03T14:45:00.970 回答