调试DLL与释放EXE
Debug DLL with release EXE
是否可以执行调试模式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实例跟踪。
例子:
-
如果您在EXE中分配内存,但在DLL中释放内存。
-
文件句柄在EXE中使用fopen()打开,但在EXE中使用或关闭(反之亦然)。
-
对于DLL接口的任何头文件,在头文件中实现任何类型的内联函数或方法都很容易导致#1或#2发生。
-
共享STL对象(std::string, std::list, std::vector)是混合CRT使用的明确禁忌。
- 释放错误后堆使用
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 终端不会为C++文件创建.exe文件吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在Windows中以.exe的形式运行c++
- Visual Studio mkl_link_tool.exe链接错误
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- PrintWindow函数在notepad.exe中出错
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- VSCode C++ 编译的exe感染了Win32:TrojanX-gen[Trj]
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 调用析构函数以释放动态分配的内存
- 如何避免在窗口上以释放模式"program.exe has stopped working"窗口?
- 调试DLL与释放EXE