动态链接如何对对象的变化做出反应

时间:2018-09-25 08:50:37

标签: c++ windows dll dllimport lib

我已经编译了与动态库(例如X.exe)链接的组件(例如Y.dll)。 XY已发布。

现在,我对Y拥有的对象函数做了一些小改动:我delete找到了一个泄漏的对象,并使其指针为NULL

要完全兼容应用此更改,我应该怎么做?

  1. 需要使用新的库文件重新编译组件X,并且还需要替换DLL;

  2. 使用新的库文件重新编译X就足够了;

  3. 替换DLL就足够了。

3 个答案:

答案 0 :(得分:4)

  

现在,我对Y所拥有的对象的功能进行了小的更改。

需要执行的操作取决于您所做的特定更改。对于这类情况,我们可以区分两种类型的更改:ABI破坏性更改和ABI兼容更改。

ABI (Application binary interface)是作为二进制级别的已编译对象的接口。与C ++函数具有API的方式类似(例如,函数的签名是API的一部分),编译后的机器语言具有ABI,ABI取决于API和调用约定等。

了解哪些变化正在破坏ABI,哪些变化没有突破,有时可能是一项艰巨的任务。但根据经验:

  • 如果您未更改Y的API,则Y的ABI不变;
  • 如果您确实更改了Y的API,则Y的ABI也将更改。

现在,如果您破坏了Y的ABI,则应该发布它的新版本(我们将其称为Y-2)。 XY-2不兼容,需要进行升级(可选)和重新编译(强制性)并作为新版本发布(我们将其称为X-2)。 XY-2不兼容ABI。 X-2Y与ABI不兼容。

如果未更改Y的ABI,则可以安全地分发新版本的Y(我们将其称为Y-1.1),它将在目标计算机和链接到原始的Y

从评论看来,

  

我所做的更改只是删除一个泄漏的对象并将其设置为NULL。

这既不是API,也不是ABI的重大更改。您只能安全地分发X

答案 1 :(得分:2)

这取决于您在DLL源代码中所做的更改。如果有任何功能添加/删除,则需要按照步骤1进行操作。如果DLL源代码的功能主体仅发生变化,则步骤3将起作用。步骤2不适用,因为在任何情况下都需要替换新的DLL。

答案 2 :(得分:2)

  

现在,我对Y所持有的对象的功能做了小的更改

什么样的变化? 仅当您更改了方法的签名并且X.exe依赖于此方法时,您才必须使用新的库文件重新编译组件X,并且还需要替换DLL 否则替换DLL就足够了