共享库的兼容性

时间:2015-04-21 13:41:11

标签: c++ linux shared-libraries

我有一个第三方使用的API来创建动态链接到我的应用程序的共享库。这些共享库声明了公共函数,这些函数返回API中定义的纯虚拟类的实现。然后,应用程序可以调用此类上的各种虚拟方法以与第三方代码进行交互。

我遇到的问题是当我更改API并尝试使用“过时的”共享库(特别是更改返回类型)时。库被正确加载(并且一些方法被调用没有问题),但是当函数签名不匹配时,我会遇到分段错误。

我理解为什么会这样(并且'修复'是为了获得更新的共享库),但我希望我能在我的应用程序中更优雅地处理此错误。 如何检查给定的共享库是否与当前版本的API兼容(因此我可以记录有用的错误)?

2 个答案:

答案 0 :(得分:1)

  

如何检查给定的共享库是否与当前版本的API兼容

有三种“标准”解决方案:

  • 在库中有一个返回版本字符串的函数,或者更好的是(major, minor, patchlevel)元组。将返回的结果与应用程序所需的结果进行比较。
  • 让新版本的库具有不同的外部版本:libfoo.so.1libfoo.so.2等。如果找不到,您的应用程序将无法运行它需要的库。阅读有关外部库版本控制here
  • 的信息
  • 在Linux和其他GLIBC平台上,更好的解决方案是执行GLIBC所做的事情:使用版本化符号。这允许旧应用程序继续使用新版本的库,并仍然获得旧符号,而新应用程序将获得新符号。使用旧库运行的新应用程序将无法以“缺少符号@版本”错误启动。符号版本控制描述为here

答案 1 :(得分:0)

  

这些共享库声明公共函数,这些函数返回它们在API中定义的纯虚拟类的实现。

这可能意味着您的共享库具有以下界面:

struct Lib
{
    virtual int foo() = 0;
};

extern "C" Lib& getLib();

此处getLib是您提到的公共功能

  

如何检查给定的共享库是否与当前版本的API兼容

要求新版本的共享库具有不同名称的公共功能