动态链接如何对对象的变化做出反应
How dynamic linking reacts on a change in object
我编译了一个与动态库(比如Y.dll
)链接的组件(比如X.exe
)。 X
和 Y
已发布。
现在我对 Y
持有的对象函数做了一个小改动:我 delete
d 一个泄漏的对象并将其指针设为 NULL
.
要以完全兼容的方式应用此更改,我应该怎么做?
需要用新的库文件重新编译组件X
,同时需要替换DLL;
用新的库文件重新编译X
就够了;
替换DLL即可
这取决于您在 DLL 源代码中所做的更改。如果有任何函数 addition/deletion 则需要执行步骤 1。如果仅 DLL 源代码的函数体发生变化,则步骤 3 将起作用。第 2 步不适用,因为无论如何您都需要替换新的 DLL。
Now I have made a small change in an object's function which Y holds
什么样的变化? 只有你改变了方法的签名,并且X.exe依赖于这个方法,那么你必须用新的库文件重新编译组件X并且需要也替换 DLL。 否则,替换DLL即可.
Now I have made a small change in an object's function which Y holds.
需要做什么取决于您所做的具体更改。对于这些类型的情况,我们可以区分两种类型的更改: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
的 ABI 未受影响,您可以安全地分发 Y
的新版本(我们称之为 Y-1.1
),它将在目标上替换 Y
计算机和 link 与原来的 X
.
从评论看来:
The change I have done is just deleting a leaked object and made it to NULL.
这既不是 API 也不是 ABI 重大更改。您只能安全地分发 Y-1.1
。
我编译了一个与动态库(比如Y.dll
)链接的组件(比如X.exe
)。 X
和 Y
已发布。
现在我对 Y
持有的对象函数做了一个小改动:我 delete
d 一个泄漏的对象并将其指针设为 NULL
.
要以完全兼容的方式应用此更改,我应该怎么做?
需要用新的库文件重新编译组件
X
,同时需要替换DLL;用新的库文件重新编译
X
就够了;替换DLL即可
这取决于您在 DLL 源代码中所做的更改。如果有任何函数 addition/deletion 则需要执行步骤 1。如果仅 DLL 源代码的函数体发生变化,则步骤 3 将起作用。第 2 步不适用,因为无论如何您都需要替换新的 DLL。
Now I have made a small change in an object's function which Y holds
什么样的变化? 只有你改变了方法的签名,并且X.exe依赖于这个方法,那么你必须用新的库文件重新编译组件X并且需要也替换 DLL。 否则,替换DLL即可.
Now I have made a small change in an object's function which Y holds.
需要做什么取决于您所做的具体更改。对于这些类型的情况,我们可以区分两种类型的更改: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
的 ABI 未受影响,您可以安全地分发 Y
的新版本(我们称之为 Y-1.1
),它将在目标上替换 Y
计算机和 link 与原来的 X
.
从评论看来:
The change I have done is just deleting a leaked object and made it to NULL.
这既不是 API 也不是 ABI 重大更改。您只能安全地分发 Y-1.1
。