当/ MT在设置中时程序工作但在/ MD时失败

时间:2013-09-05 11:52:34

标签: c++ build linker

我有一个DLL和3个使用此DLL的应用程序。 (这些应用程序不会同时运行)

在3个应用程序中,2个完美地工作但是1个应用程序在一段时间后没有从一个DLL函数得到响应(在第7个函数调用时,具体)。 此外,如果我使用Application或我的DLL的调试版本,代码可以正常工作。它仅在发布版本中停止。

在度过了2个不眠之夜后,我发现如果我将DLL的项目属性从/MD更改为/MT,则此应用程序可以正常运行。

我不知道为什么会发生这件事。任何人都可以为睡眠不足的程序员解释这个!

更新:

我会在市场上发布这个DLL而且我不能说用户应用程序是构建的是/MT还是/MTD还是其他......有什么方法可以确保它能够正常工作任何申请。

2 个答案:

答案 0 :(得分:2)

在Windows中,EXE和DLL文件是模块。 动态编译的每个模块(/ MD)共享一个堆。 所以在动态模块中,如果一个模块调用malloc(或new) 另一个模块对对象的自由(或删除)都很好。

编译为在C运行时中静态链接的每个模块都有自己的堆。 如果一个静态模块分配对象和不同的静态或动态 模块试图释放对象,程序会因为分配而崩溃 而且免费是针对不同的堆。

Allocating and freeing memory across module boundaries

答案 1 :(得分:0)

/ MD将运行时链接为动态,如果计算机已正确安装运行时,则编译为/ MT将起作用,因为运行时将包含在二进制文件中。

当你将它编译为Debug模式时,它也可以解释,在调试模式下,运行时的调试版本静态链接到二进制文件。

查看here,了解有关该主题的一些讨论。

<强>更新 另一个问题可能是dll是用不同的选项编译的模块,如msdn article中所述:

  

传递给链接器的给定调用的所有模块必须是   使用相同的运行时库编译器选项(/ MD,/ MT,   / LD)。