MTD和MDd导致的问题

本文探讨了MTD(使用静态库LIBCRTD.LIB)与MDD(使用动态库MSVCRTD.DLL)两种运行时库模式的区别,特别是它们如何影响全局变量的管理以及malloc和free函数调用时可能出现的问题。
部署运行你感兴趣的模型镜像

MTD指的是使用的运行时库为静态库LIBCRTD.LIB,MDD则使用动态库MSVCRTD.DLL运行时库作为链接版本;

 

静态库LIBCRTD.LIB在引用它的工程里自定义了该静态库需要创建的全局变量;

动态库MSVCRTD.DLL已经在DLL模块内部定义了全局变量;

 

对MALLOC和FREE函数的调用问题:

    工程A(EXE或LIB或DLL)使用MTD, A引用模块B.DLL, B.DLL使用MDD;此时A使用malloc和free函数时堆管理全局变量定义在A模块中,B.DLL使用malloc和free函数时堆管理全局变量定义在B模块中,当A使用B定义的内存空间并在A中使用free时因为调用的是A模块的内存管理全局变量从而导致出错;

     当A引用的不是B.DLL而是C.LIB,并且C.LIB使用MDD时;此时C.LIB相当于是A模块的代码,这时A模块同时使用了MTD和MDD从而导致链接无法通过,在A模块属性中选择“忽略导入库”也不能解决问题;只有通过修改A和C两个模块的运行时库模式一样才能解决问题;

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### ### OpenCV 编译时如何配置不同的运行时选项 /MT /MTd /MD /MDd OpenCV 在使用 CMake 生成 Visual Studio 工程文件时,可以通过修改项目属性来控制使用的运行时类型。运行时的选择影响程序在运行时是否依赖 Microsoft Visual C++ 运行时 DLL(如 `msvcr100.dll` 或 `msvcp100.dll`)。 默认情况下,CMake 会根据所选的构建类型(Debug 或 Release)设置相应的运行时选项。例如,在 Debug 构建中通常使用 `/MDd` 或 `/MTd`,而在 Release 构建中使用 `/MD` 或 `/MT`。为了确保链接一致性,整个项目及其依赖的必须使用相同的运行时选项。 如果希望将 OpenCV 静态编译并使用多线程调试模式(即 `/MTd`),需要在生成工程后手动修改所有相关项目的运行时设置。具体操作为: - 打开 Visual Studio 解决方案。 - 右键点击除 `ALL_BUILD`, `INSTALL`, `ZERO_CHECK`, `uninstall` 之外的所有项目。 - 选择“属性” → “配置属性” → “C/C++” → “代码生成”。 - 将“运行时”设置为 `/MTd`[^2]。 这种方式适用于希望避免运行时依赖 VC++ 动态的情况,特别适合部署到没有安装 VC++ 运行的机器上。 若需使用动态运行时(即 `/MD` 或 `/MDd`),则无需额外修改,因为这是 CMake 默认生成的配置。此时,程序在运行时需要对应的 `MSVCRT.lib` `MSVCRxx.DLL` 文件支持。需要注意的是,如果某个是用 `/MT` 编译的,而主程序或另一个使用 `/MD`,会导致链接错误,因为它们引用了不同的运行时版本[^4]。 此外,OpenCV 提供了一些预编译路径,例如 `F:\Opencv\build\x86\vc10\staticlib`,这些静态可以直接被引用,但使用时仍需确认其运行时设置是否与当前项目一致。如果不一致,可能会导致链接错误或运行时崩溃。因此,在调试环境下建议显式设置 `/MTd` 并验证兼容性[^1]。 --- ```bat # 示例:使用 CMake 生成 Debug 模式下的 VS2013 工程,并指定 x64 平台 cmake.exe -G "Visual Studio 12 2013" -A x64 -DCMAKE_BUILD_TYPE=Debug .. ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值