我已经编译了与动态库(例如X.exe
)链接的组件(例如Y.dll
)。 X
和Y
已发布。
现在,我对Y
拥有的对象函数做了一些小改动:我delete
找到了一个泄漏的对象,并使其指针为NULL
。
要完全兼容应用此更改,我应该怎么做?
需要使用新的库文件重新编译组件X
,并且还需要替换DLL;
使用新的库文件重新编译X
就足够了;
替换DLL就足够了。
答案 0 :(得分:4)
现在,我对Y所拥有的对象的功能进行了小的更改。
需要执行的操作取决于您所做的特定更改。对于这类情况,我们可以区分两种类型的更改:ABI破坏性更改和ABI兼容更改。
ABI (Application binary interface)是作为二进制级别的已编译对象的接口。与C ++函数具有API的方式类似(例如,函数的签名是API的一部分),编译后的机器语言具有ABI,ABI取决于API和调用约定等。
了解哪些变化正在破坏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
。
从评论看来,
我所做的更改只是删除一个泄漏的对象并将其设置为NULL。
这既不是API,也不是ABI的重大更改。您只能安全地分发X
。
答案 1 :(得分:2)
这取决于您在DLL源代码中所做的更改。如果有任何功能添加/删除,则需要按照步骤1进行操作。如果DLL源代码的功能主体仅发生变化,则步骤3将起作用。步骤2不适用,因为在任何情况下都需要替换新的DLL。
答案 2 :(得分:2)
现在,我对Y所持有的对象的功能做了小的更改
什么样的变化? 仅当您更改了方法的签名并且X.exe依赖于此方法时,您才必须使用新的库文件重新编译组件X,并且还需要替换DLL 。 否则,替换DLL就足够了。