C++ 共享库的兼容性
我有一个API,第三方使用它来创建动态链接到我的应用程序中的共享库。这些共享库声明公共函数,这些函数返回API中定义的纯虚拟类的实现。然后,应用程序可以调用此类上的各种虚拟方法,以与第三方代码接口 我遇到的问题是,当我更改API并尝试使用“过时”的共享库时(特别是更改返回类型)。库的加载很好(一些方法的调用没有问题),但是当函数签名不匹配时,我会出现分段错误 我理解为什么会发生这种情况(“修复”是为了获得更新的共享库),但是我希望我可以在我的应用程序中更优雅地处理这个错误如何检查给定的共享库是否与当前版本的API兼容(以便记录有用的错误) 这些共享库声明公共函数,这些函数返回API中定义的纯虚拟类的实现 这可能意味着您的共享库具有以下接口:C++ 共享库的兼容性,c++,linux,shared-libraries,C++,Linux,Shared Libraries,我有一个API,第三方使用它来创建动态链接到我的应用程序中的共享库。这些共享库声明公共函数,这些函数返回API中定义的纯虚拟类的实现。然后,应用程序可以调用此类上的各种虚拟方法,以与第三方代码接口 我遇到的问题是,当我更改API并尝试使用“过时”的共享库时(特别是更改返回类型)。库的加载很好(一些方法的调用没有问题),但是当函数签名不匹配时,我会出现分段错误 我理解为什么会发生这种情况(“修复”是为了获得更新的共享库),但是我希望我可以在我的应用程序中更优雅地处理这个错误如何检查给定的共享库是否
struct Lib
{
virtual int foo() = 0;
};
extern "C" Lib& getLib();
这里getLib
就是您提到的公共函数
如何检查给定的共享库是否与当前版本的API兼容
要求新版本的共享库具有不同名称的公共函数
如何检查给定的共享库是否与当前版本的API兼容
有三种“标准”解决方案:
- 在库中有一个函数,它返回一个版本字符串,或者更好的是一个
元组。将返回的结果与应用程序需要的结果进行比较(主、次、patchlevel)
- 让库的新版本具有不同的外部版本:
,libfoo.so.1
,等等。如果应用程序找不到所需的库,则将无法运行。阅读有关外部库版本控制的信息libfoo.so.2
- 在Linux和其他GLIBC平台上,更好的解决方案是像GLIBC那样:使用版本符号。这允许旧应用程序继续使用库的新版本,并且仍然获得旧符号,而新应用程序将获得新符号。使用旧库运行的新应用程序将无法以“缺少”启动symbol@Version“错误。描述了符号版本控制