可以对dll进行更改,同时保持与预编译的可执行文件的兼容性吗?
Can changes to a dll be made, while keeping compatibility with pre-compiled executables?
我们有很多可执行文件引用了我们的一个dll。我们在一个dll中发现了一个bug,不想重新编译和重新发布所有的可执行文件来修复它。我的理解是,只要您不更改头文件中的任何内容,dll将保持其与可执行文件的兼容性。所以没有新的类成员,没有新的函数等等……但是对函数内的逻辑进行更改应该是可以的。这是正确的吗?如果它是编译器特定的,请让我知道,因为这可能是一个问题。
你的理解是正确的。只要你改变逻辑而不是接口,那么你就不会遇到兼容性问题。
你必须小心的地方是,如果到DLL的接口不仅仅是函数签名。例如,如果原始DLL接受int
参数,但新DLL强制该参数的值必须为正,那么您将破坏旧程序。
可以。只要DLL的接口保持不变,旧的可执行文件就可以很好地加载它并使用它。话虽如此,你正走上一条非常危险的道路。随着时间的推移,您修补了越来越多的dll,您可能开始在客户安装中看到几乎无法诊断的奇怪行为。这源于各种组件的不同版本之间的意外交互。从历史上看,这个问题被称为DLL地狱。
在我看来,重新构建、重新测试和重新分发整个应用程序是一个更好的主意。我甚至会进一步建议您使用应用程序清单来确保可执行文件只能与特定版本的dll一起工作。现在看起来可能要做很多工作,但它确实可以在将来为您节省很多麻烦。
看情况
理论上是的,如果你用LoadLibrary加载dll并且没有改变接口,你应该没问题。
如果您使用一些。lib存根与。dll文件进行OTOH链接,则不能保证它会工作。
这就是COM被发明的原因之一。
相关文章:
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 编译的C可执行文件被Windows defender检测为病毒
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 编译可执行文件之前未生成的文件
- 使用共享库编译可执行文件时仅链接所需的符号
- 在 Ubuntu 18.04 上,我编译的 cpp 可执行文件找不到 VTK7 依赖项
- 从 PHP 调用已编译的C++可执行文件来创建套接字
- 如何在 Azure 应用服务中使用 cl.exe 编译 C++ 代码并生成可执行文件
- 使用 make 编译多个可执行文件
- 使用 MINGW 和 CPLEX 库链接从 Linux 编译 Windows 可执行文件
- 如何从 Linux 交叉编译到 32 位 Windows 可执行文件
- 使用 g++ 和 Makefile 编译 c++ 时可执行文件非常大
- 在QMAKE中编译之前,如何使用可执行文件构建多个标头文件
- 如何在Linux中编译C 程序以生成Windows可执行文件
- MinGW 编译的可执行文件与网络无法在 x64 系统上运行
- Cython:编译独立的静态可执行文件
- 从.pro编译可执行文件
- 使用.dll文件编译可执行文件,.dll与.exe相关的文件
- 如何在C++中调用预编译可执行文件中的函数(通过命令调用)