病毒吧 关注:320,746贴子:1,303,882
  • 0回复贴,共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回复