更改运行时库选项对运行时链接的影响

Effect of Changing Runtime Library Option on Runtime Linkage

本文关键字:运行时 链接 影响 选项      更新时间:2023-10-16

Microsoft Visual Studio 2015 (v14.0)中,我有一个包含3个项目的解决方案。

其中两个是dll,另一个是可执行文件。
可执行文件在运行时加载dll,调用它们的函数并交换参数;使用windows的LoadLibraryGetProcAddress api。

Release模式下,当我将项目的Runtime Library设置为Multi-threaded DLL时,一切工作正常。这是Debug模式的Multi-threaded Debug DLL

如果我为ReleaseMulti-threaded Debug更改为DebugMulti-threaded,我开始得到调试断言错误或内存访问冲突错误和其他类型的错误。(当我更改它时,我会为解决方案中的所有项目更改它。)

我需要使用Multi-threaded选项,以便可执行文件在目标机器上不需要c++运行时库。如何解决这个问题?

这是因为使用/MT将实体(即dll和可执行文件)的运行时分开,每个实体都有自己的运行时,因此有自己的堆,试图在一个中分配内存并在另一个中释放内存将以错误告终。因为其他模块对分配的内存无关。
另一方面,对于/MD,所有模块共享相同的运行时,并且由于运行时知道在一个模块中分配的内存,因此它将能够在另一个模块中释放内存。因为一个运行时实例管理整个内存。

编辑:

感谢dxiv注释