2023年11月27日发(作者:)
⽆法启动此程序,因为计算机中丢失api-ms-win-crt-stdio-l1-1-
解决
问题描述
最近⽤⼀台Windows Server 2012 R2系统的机器的时候碰到了这个问题。
因为在⽹上看了很多解决⽅案,都没有很好的解决。所以记录⼀下这个问题的解决。
之前使⽤VS2013编译出的程序,是没有这个问题的。这个问题仅仅出现在VS2015编译的程序上。
重新安装了⼀个 Windows server 2008 R2的虚拟机,然后安装了vc_(VC2015x64版本),运⾏程序是没有问题的。这个
winserver2008的系统镜像是下载的微软原版的,所以这⾥猜测安装win server 2012的服务器安装的系统可能并不是完整的。
解决过程
通过在服务器上的C:WindowsSystem32(64位系统System32下是64位dll,SysWOW64⽬录下是32位dll)下搜索也没有找到相关
的dll⽂件。
根据⽹上的⼀些资料,解决的办法就是安装VC运⾏时库和KB2999226补丁。这个⽅法我尝试过了,但是没有效果。微软提供了下载,⾥⾯
包含多个操作系统下的补丁。
既然上⾯的⽅法可能⽆法解决,那就先看看具体的依赖情况
使⽤VS2015⾃带dumpbin查看依赖
dumpbin /dependents uds_
Microsoft (R) COFF/PE Dumper Version 14.00.24218.2
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file uds_
File Type: EXECUTABLE IMAGE
Image has the following dependencies:
uds_module_
WS2_
因为已经没有dll找不到的问题了,所以对于这个问题就⽐较费解了。因为dumpbin并没有找出所有依赖的dll(⽐如上⾯没有找到api-ms-win-
,但这个是被依赖的)。
使⽤Dependecy Walker⼯具可以看出来,__stdio_common_vfprintf这个函数在⾥⾯。
但是⽆法看出依赖了那些项⽬。
所以考虑是不是还有dll没有拷贝进去。发现⽬录下有这个⽂件,感觉这应该是所有这些dll的基础依赖。把它拷贝进去之后,便
可以正常运⾏了。
经过试验,这个问题的原因在于没有成功安装KB2999226补丁,有些系统这个补丁是安装不上的。只要找到这个⽂件,拷贝到
程序⽬录下就可以了。
因为⼀台机器上同时按照VS2013和VS2015编译出的版本可能会有冲突,所以不适合把它拷贝到System32⽬录(⽕狐就是⾃带了)。
可以通过设置Path环境变量来设置加载的dll查找位置。因为Windows下依赖的dll查找顺序()是最后⼀个从Path环境变量中查找的,从⽽可能
导致找到的并不是你想要的。
# 这⾥将dll放置在当前路径下的api-ms-win-crt⽬录下
set Path=%Path%;%cd%api-ms-win-crt
# 启动程序
start program
1. 应⽤程序所在的⽬录
2. SetDllDirectory所设置的路径,如果没有设置,就是当前⼯作路径(GetCurrentDirectory)
3. system⽬录,可通过 GetSystemDirectory获取。(通常是C:Windowssystem32)
4. 16位系统的⽬录。(16位程序使⽤的,通常是C:Windowssystem)
5. Windows⽬录,可通过GetWindowsDirectory获取。(C:Windows)
6. PATH环境变量中指定的路径。(PATH环境变量中路径的搜索顺序是在前⾯的优先,且系统环境变量优先于⽤户环境变量)
发布评论