【发布时间】:2012-12-03 13:55:21
【问题描述】:
我正在开发一个 C++ 应用程序,它需要在运行时使用 dlopen 加载动态库。这个库一般不会是我写的。
人们推荐什么方法来确保这个库和我的应用程序之间的未来二进制兼容性?
我看到的选项是:
将版本号放在库文件名中,无论如何都尝试加载它(通过符号链接)。如果dlopen失败,报错。
维护返回版本号的第二个接口。但是,如果这个界面由于某种原因发生了变化,我们会遇到和以前一样的问题。
还有其他选择吗?
【问题讨论】:
我正在开发一个 C++ 应用程序,它需要在运行时使用 dlopen 加载动态库。这个库一般不会是我写的。
人们推荐什么方法来确保这个库和我的应用程序之间的未来二进制兼容性?
我看到的选项是:
将版本号放在库文件名中,无论如何都尝试加载它(通过符号链接)。如果dlopen失败,报错。
维护返回版本号的第二个接口。但是,如果这个界面由于某种原因发生了变化,我们会遇到和以前一样的问题。
还有其他选择吗?
【问题讨论】:
您应该定义一个关于动态加载(即dlopen-ed)库的约定。
您可能有这样的约定,即库需要提供一个const char mylib_version_str[]; 符号,该符号给出了 API 的版本等。当然,您可以有自己的预处理器技巧来帮助解决这个问题。
为了获得灵感,您可以查看 GCC 对 plugins 的要求(例如 plugin_is_GPL_compatible 符号)。
如果动态加载的库是 C++ 的,你可以使用demangling 来检查函数的签名......
【讨论】:
dlopen 一个 64 位库!
为什么不同时使用这两个选项?基本上很少有库已经这样做了(例如 Lua,旧的 dll 是 Lua51.dll,然后你有 Lua52 等。你也可以查询它的版本。)
一个好的接口可以改变,但不是那么频繁,为什么要2个简单的静态方法
const char* getLibraryName();
uint32 getLibraryVersion();
换加班?
【讨论】:
如果您/他们正在使用 libtool 来构建库/应用程序,您可能会推荐这种方式:http://www.gnu.org/software/libtool/manual/libtool.html#Versioning
【讨论】: