使用Visual Studio 2015编译了几个.dll文件,并尝试在一些旧的Windows 7 / 64位上部署。还尝试猜测哪些dll文件需要应用程序启动并复制MSVCP140.DLL和VCRUNTIME140.DLL - 但应用程序无法加载vs2015 dll。开始分析问题-依赖项检查器显示来自以下dll文件的依赖项:
API-MS-WIN-CRT-MATH-L1-1-0.DLL
API-MS-WIN-CRT-HEAP-L1-1-0.DLL
API-MS-WIN-CRT-CONVERT-L1-1-0.DLL
API-MS-WIN-CRT-STRING-L1-1-0.DLL
API-MS-WIN-CRT-STDIO-L1-1-0.DLL
API-MS-WIN-CRT-RUNTIME-L1-1-0.DLL
API-MS-WIN-CRT-FILESYSTEM-L1-1-0.DLL
API-MS-WIN-CRT-TIME-L1-1-0.DLL
尤其令人惊讶的是,根据我最好的理解,CRT负责启动dll/exe,但不提供任何高级服务。
好吧,我尝试找出如何摆脱它们或至少将它们最小化。
找到一篇文章: https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/
它提到了发布静态库 - 所以我想我可以链接到它们并摆脱*L1-1-0.DLL*依赖地狱,但无论我尝试了什么 - 我都没有成功。我已经尝试链接到libvcruntime.lib、libucrt.lib、libcmt.lib,尝试禁用链接器选项“/nodefaultlib:vcruntime.lib”,甚至尝试添加包含目录$(UniversalCRT_IncludePath),并覆盖一些定义,因为我猜测它们会起作用 - 我所有的尝试都没有帮助。
作为中间解决方案,我回退到使用Visual Studio 2013,其中CRT dll只有两个:msvcp120.dll,msvcr120.dll。
当然,您可能会建议安装Visual Studio 2015运行时,但我们的一个要求是支持独立的可执行文件 - 它可以在没有任何安装的情况下工作 - 因此现在不考虑附加的安装。
除了等待Visual Studio 2017到来以外,您能给我推荐别的什么吗?
crtdll.c
文件只是CRT的一小部分,它还包括许多其他内容,例如在您链接的Code Project文章中描述的printf
的实现。唯一的区别是现在CRT已被分成单独的库和DLL。如果您想知道他们为什么这样做,可以尝试阅读您在帖子中链接的MSDN博客条目以及它开头引用到的博客条目。作为奖励,如果您花时间阅读到最后,您还会找到解决问题的方法。 - Ross Ridge