静态链接VC++ Runtime至EXE后,DLL能否共用该运行时链接?
VC++运行时库静态链接的依赖问题
核心问题
- 现有VC运行时库L、调用L的程序EXE、同样调用L的动态链接库DLL(EXE会调用DLL功能),当前系统未安装C Redistributable,仅给EXE静态链接L,DLL未静态链接L,运行EXE调用DLL功能时是否会失败?
- 若要让依赖VC Redistributable的DLL在未安装该组件的系统上运行,仅给EXE静态链接VC Runtime,DLL能否共用该运行时?还是必须同时给DLL也静态链接?
结论与分析
程序会运行失败,仅给EXE静态链接无法让DLL共用运行时,必须给DLL也静态链接VC Runtime,或者安装C++ Redistributable包。
原因如下:
- 当DLL项目未开启VC Runtime静态链接时,编译阶段VC头文件会生成动态链接相关代码,运行时会尝试通过
GetProcAddress从vcruntime140.dll这类动态运行时库中加载函数。 - EXE静态链接的L是嵌入在EXE进程空间内的私有运行时实例,DLL作为独立模块,无法直接共用这个实例——两者的运行时依赖是在编译阶段就确定的,动态链接的DLL只会去系统中寻找对应的VC动态运行时库,不会调用EXE里的静态运行时。
具体场景解决方案
针对“让调用该DLL的程序在未安装VC Redist的电脑上直接运行”的需求,有两种可行方案:
- 给DLL项目开启VC Runtime静态链接:在Visual Studio中,进入DLL项目的项目属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行库,将其设置为
多线程(/MT)(Debug版本选择多线程调试(/MTd)),编译后DLL会将VC运行时嵌入自身,无需依赖系统中的动态运行时库。 - 随程序打包VC动态运行时库:将
vcruntime140.dll、msvcp140.dll等所需的动态库文件,和EXE、DLL放在同一目录下,程序运行时会优先加载本地的动态库,无需安装Redistributable包。
内容的提问来源于stack exchange,提问作者Stdugnd4ikbd
相关产品推荐
相关产品推荐

