调试DLL与释放EXE

Debug DLL with release EXE

本文关键字:EXE 释放 DLL 调试      更新时间:2023-10-16

是否可以执行调试模式DLL与发布模式EXE?

我正在尝试这种情况,但EXE没有加载调试DLL并抛出错误"此应用程序未能启动…"。

我知道这不是一个好的场景,但由于某些要求,我必须使这个工作

如果您的dll接口不依赖于可能在调试和发布中看起来不同的类,则可以工作。例如,MSVC中的std::string和std::vector在调试和发布中不兼容。(栅栏…)

例如

std::string GetName();

不能工作

In additional new和delete不应该移动,因为调试/发布使用不同的运行时。但无论如何,您应该始终将delete置于与new相同的上下文中(dll/exe)。

可以。

您的"应用程序启动失败"问题很可能是您复制了DLL的调试构建(在使用Visual Studio的机器上构建)到没有安装debug CRT的机器上。通常将MSVCRTD(version).dll复制到与程序文件相同的目录中可以解决此问题。我之前有一个答案,涵盖了这里的一些问题。

最好的办法是始终将所有二进制文件链接到相同的动态MSVCRT DLL,以便它们都共享相同的运行时。

另一个简单的解决方法是编译DEBUG DLL以使用与MSVCRT DLL相同的风格(或静态链接到CRT)。在VS项目属性页的某个地方(我认为是代码生成)是选择CRT的下拉菜单。将零售MSVCRT链接到调试DLL或静态链接没有任何问题。

需要注意的是,当您将不同风格的调试C运行时链接到不同的二进制文件时。如果您为EXE链接了发布MSVCRT dll,但为dll链接了调试MSCVRTD dll,那么在某些情况下可能会导致问题。这是因为句柄和内存块由两个不同的CRT实例跟踪。

例子:

  1. 如果您在EXE中分配内存,但在DLL中释放内存。

  2. 文件句柄在EXE中使用fopen()打开,但在EXE中使用或关闭(反之亦然)。

  3. 对于DLL接口的任何头文件,在头文件中实现任何类型的内联函数或方法都很容易导致#1或#2发生。

  4. 共享STL对象(std::string, std::list, std::vector)是混合CRT使用的明确禁忌。