病毒吧 关注:320,746贴子:1,304,390
  • 6回复贴,共1

【开发小记】关于自己开发的程序如何避免使用微软MSVC支持库

只看楼主收藏回复

一、现象描述:
今天在开发程序时,编译后运行,win10平台正常。但是在win7平台运行,就弹出如截图所示的“无法启动此程序,因为计算机中丢失vcruntime140.dll”。

出于好奇,我使用IDA工具解析了可执行文件的导入表。结果,好家伙,C语言的标准库函数memcpy和memset连接到 vcruntime140.dll。

我心想我用的都是C标准库函数啊,为什么会定位到C++支持库里?原来我开发用的是VS2015版本,该版本自动关联到2015后发行的支持库去。这也就是为什么程序在win10可以正常运行,但移植到win7就提示缺少库文件。因为较老的操作系统没有内置新版本的运行库。
二、解决办法:
编译之前,在VS2015的工程设置(如图所示)中,将运行库设置为“多线程 (/MT) ”或 “多线程调试 (/MTd)”,直接链接静态库,而不是链接动态库。

再次编译,IDA解析后发现导入表中已经不再需要链接vcruntime140.dll了。

转到win7平台运行,成功!

三、碎碎念:
链接静态库后,代码会打包进可执行文件,这会使可执行文件体积相对大一些,但是不依赖系统的动态支持库;即使系统中缺少相应的动态库,程序依旧可以正常运行。链接动态库,则可执行文件的体积小得多,但是会依赖系统的动态支持库;一旦系统缺少相应的动态库,程序就报错。/MT用于发行版编译,/MTd用于调试版编译。


IP属地:山东1楼2025-11-17 19:36回复
    围观吧主开发日常,威武!


    IP属地:浙江来自Android客户端2楼2025-11-17 19:41
    回复
      2026-04-18 01:08:20
      广告
      不感兴趣
      开通SVIP免广告
      厉害的!感觉生活更有安全感了.


      IP属地:江苏来自iPhone客户端3楼2025-11-17 19:42
      回复
        点赞了


        IP属地:湖南来自Android客户端4楼2025-11-17 19:49
        回复
          支持


          IP属地:内蒙古来自Android客户端5楼2025-11-17 21:11
          回复
            关于为什么会需要vcruntime140动态库。
            msvc本身是c++编译器,只是c++标准要求兼容c标准库,msvc里面的c和c++标准库都基于相同的vcruntime实现,然后msvc的c++标准库其实依赖c标准库来实现(随便翻翻标准库就会发现include了一堆c头文件)。


            IP属地:江苏来自iPhone客户端6楼2025-11-17 23:05
            收起回复