【问题标题】:Check compatibility of dynamic library at runtime在运行时检查动态库的兼容性
【发布时间】:2012-12-03 13:55:21
【问题描述】:

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

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

我看到的选项是:

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

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

还有其他选择吗?

【问题讨论】:

    标签: c++ linux dlopen


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 它的美妙之处在于您不需要运行任何代码。只要库使用正确的格式 - 例如elf - 你可以读出任何静态字符串。考虑有人在 32 位系统上加载 64 位库。他们仍然可以读出版本信息。
    • 我不确定你是否可以在纯 32 位系统上 dlopen 一个 64 位库!
    【解决方案2】:

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

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

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

    换加班?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 在您的答案中添加一小段摘录。仅链接不被视为有效答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多