运行程序显示丢失“MSVCR100D.dll”
前言#
写了一个Dll注入工具,结果发现程序在其他机器上会出现丢失“MSVCR100D.dll”。这个dll是vs2010自带的动态链接库,如果在没安装vs2010运行库的电脑中使用就会出现这种情况。我在网上搜了一下并总结所涉及的知识。
/MD , /MDd 与 /MT , /MTd#
这些是程序在被编译器编译时的所传入的参数,不同的参数编译器会做出不同的操作。
/MD#
/MD的意思是多线程DLL的版本,编译器会把MSVCRT.lib放到.OBJ文件中,然后链接器会通过MSVCRT.lib解析外部符号。其是动态编译,也就是程序将相应dll的信息保存在导入表中,如此一来程序在运行的时候就必须依赖于相应的dll。如果缺少相应的dll将无法运行,如果是vs2010编写的程序也就会出现缺失MSVCR100.dll。
/MDd#
/MDd和/MD差不多,只不过其是在调试状态下。所以链接器会将MSVCRTD.lib放到.OBJ文件中。如果是vs2010编写的程序其将依赖于MSVCR100D.dll。
/MT#
/MT的意思是多线程静态的版本。编译器会把静态多线程标准 C++ 库(libcpmt.lib)放到 .OBJ文件中,然后链接器通过libcpmt.lib解析外部符号。其属于静态编译,所以会将那些本来是在dll中导出的函数都整合到exe文件中。这样exe文件就会变大,其在运行的时候也不需要去依赖于相应的动态链接库。在程序的输入表中也不会有相应的dll信息。
/MTd#
/MTd 与 /MT相似,只不过其实调试状态下的。编译器会将libcpmtd.lib放到.OBJ文件中,链接器通过libcpmtd.lib解析外部符号。
总结#
所以为了让程序不依赖与MSVCRT100D.dll或者是MSVCRT100.dll,我们需要在用VS2010编写程序的时候将编译选项设置为 /MT或/MTd。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】