• 运行程序显示丢失“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。

  • 相关阅读:
    asp生成随机密码
    ASP用FSO生成HTML简单实例+详解 asp生成html 空白
    jquery ajax
    js屏蔽F5 兼容ie和firefox
    VS2003+SQL Server2000环境下出现的“未将对象引用设置到对象的实例”错误
    Hibernate开发笔记
    用SETUP FACTORY制作安装程序
    SPRING jdbc THIN方式 访问ORACLE数据库慢的解决方案
    JAVA如何调用DOS命令(转载)
    在WEBLOGIC9.1上部署SPRING+WEBWORK 的WEB应用
  • 原文地址:https://www.cnblogs.com/revercc/p/13287075.html
Copyright © 2020-2023  润新知