Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享库的兼容性_C++_Linux_Shared Libraries - Fatal编程技术网

C++ 共享库的兼容性

C++ 共享库的兼容性,c++,linux,shared-libraries,C++,Linux,Shared Libraries,我有一个API,第三方使用它来创建动态链接到我的应用程序中的共享库。这些共享库声明公共函数,这些函数返回API中定义的纯虚拟类的实现。然后,应用程序可以调用此类上的各种虚拟方法,以与第三方代码接口 我遇到的问题是,当我更改API并尝试使用“过时”的共享库时(特别是更改返回类型)。库的加载很好(一些方法的调用没有问题),但是当函数签名不匹配时,我会出现分段错误 我理解为什么会发生这种情况(“修复”是为了获得更新的共享库),但是我希望我可以在我的应用程序中更优雅地处理这个错误如何检查给定的共享库是否

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

我遇到的问题是,当我更改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“错误。描述了符号版本控制

添加另一个纯基类,询问它们实现的版本(也就是每次更新API时在头文件中更改的一个常量,可以很好地实现这一点)。类似于PlugInDescriptor::GetApiVersion()。当然,您必须保持PlugInDescriptor签名的固定。同样,一个简单的导出C函数也可以很好地工作。@AdrianoRepetti我曾考虑过使用您所描述的版本检查,但是由于共享库已经存在,没有这个功能,这并不理想(事实上,从一开始就应该实现它)。此外,对API的更改应该是最小的,所以这个问题在将来不会太普遍。你能详细说明一下我如何用C函数来解决这个问题吗?我目前在共享库中使用这些函数来返回应用程序使用的虚拟类。一个用于获取类的导出函数。如果GetProcAddress返回NULL,那么它是一个较旧的版本…如果它返回一个地址,那么您可以安全地调用GetPlugInApiVersion()并检查版本…@AdrianoRepetti我看到它与版本控制有关。对不起,我以为你的意思是,我的错。