2013-02-28 70 views
3

使用发行版EXE可以执行调试模式DLL吗?使用发行版EXE调试DLL

我正在尝试这种情况,但EXE不加载调试DLL并引发错误“此应用程序未能启动...”。

我知道这不是很好的方案,但由于某些要求,我必须做这项工作。

+0

是的,这是可能的。加载失败应该是其自身特定的原因,如缺少依赖性。 – 2013-03-01 08:41:00

+0

检查您的调试版本设置。通常,当缺少库时或者在代码生成中使用“多线程调试Dll”选项构建时,会显示此错误。 – Abhineet 2013-03-01 08:48:07

+0

@Abhineet:我尝试使用“多线程DLL”选项构建。还是同样的问题... – Nipun 2013-03-01 11:11:55

回答

2

是的,这可以工作。

您的“应用程序未能启动”问题很可能是您将DLL的调试版本(构建在您的计算机上的Visual Studio)复制到未安装DEBUG CRT的计算机。通常通过MSVCRTD(版本).dll复制到您的程序文件相同的目录解决此问题。我有一个覆盖here的一些前面的答案。

最好的办法是始终将所有的二进制文件链接到同一个动态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. 对于混合CRT的使用,共享STL对象(std :: string,std :: list,std :: vector)是一个明确的禁忌。

2

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

因此,例如

std::string GetName(); 

将无法​​正常工作。

由于调试/版本使用不同的运行时,所以不应该移动附加的新的和删除。但无论如何,你应该始终delete在相同的上下文(dll/exe)new

+0

我创建了一个非常基本的DLL,它只是返回一个整数值。 – Nipun 2013-03-01 11:13:22