c++ - 动态链接如何对对象的变化作出反应
问题描述
我已经编译了一个X.exe
与动态库(比如)链接的组件(比如Y.dll
)。X
并Y
已被释放。
现在我对一个对象的函数做了一个小改动Y
:我已经delete
泄露了对象并创建了它的指针NULL
。
要以完全兼容的方式应用此更改,我应该怎么做?
需要
X
用新的库文件重新编译组件,还需要替换DLL;用新的库文件重新编译
X
就足够了;更换 DLL 就足够了。
解决方案
现在我对 Y 持有的一个对象的函数做了一个小的改动。
需要做什么取决于您所做的具体更改。对于这些类型的情况,我们可以区分两种类型的更改:破坏 ABI 的更改和兼容 ABI 的更改。
ABI(Application binary interface)是二进制级别的编译对象的接口。与 C++ 函数具有 API 的方式类似(例如,函数的签名是 API 的一部分),编译的机器语言具有依赖于 API 和调用约定等的 ABI。
了解哪些更改是破坏 ABI 的,哪些不是,有时可能是一项艰巨的任务。但根据经验:
- 如果您没有更改 Y 的 API,则 Y 的 ABI 不变;
- 如果您确实更改了 Y 的 API,则 Y 的 ABI 也会更改。
现在,如果您破坏了Y
的 ABI,您应该发布它的新版本(我们称之为Y-2
)。X
将不兼容Y-2
并且需要升级(可选)和重新编译(强制)并作为新版本发布(我们称之为X-2
)。X
并且Y-2
不兼容 ABI。X-2
并且Y
不兼容 ABI。
如果Y
's ABI 未受影响,您可以安全地分发新版本Y
(我们称之为Y-1.1
),它将Y
在目标计算机上替换并与原始X
.
从评论中可以看出:
我所做的更改只是删除了一个泄漏的对象并将其设置为 NULL。
这既不是 API 也不是 ABI 重大更改。您只能安全地分发Y-1.1
。