GCC突然停止工作了?缺少依赖项?
GCC突然停止工作了?缺少依赖项?
我在我们的可执行文件上遇到了问题。我在我的Windows 7 64位开发机上运行这个C++ 32位可执行文件,该开发机还安装了所有这些Microsoft应用程序(Visual Studio 2008 + 2010、TFS、SDK、Microsoft Office)...
而它仍然正常运行。
现在我得到了同样程序的客户端安装程序,并被要求在一个干净的Windows 7安装中进行测试。因此,我得到了一个Windows 7 64位的VMware,并将其更新到了Windows 7 SP 1(与我的开发机版本完全相同)。
但是,在我的开发机上一切都很好,但是该程序在VMware(30天试用版)上无法工作。
x86 Dependency Walker 告诉我以下DLL文件丢失:
- API-MS-WIN-CORE-COM-L1-1-0.DLL
- API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
- API-MS-WIN-CORE-WINRT-L1-1-0.DLL
- API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
- API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
- API-MS-WIN-SHCORE-SCALING-L1-1-0.DLL
- DCOMP.DLL
- GPSVC.DLL
- IESHIMS.DLL
我在谷歌上搜索了这些API-MS-WIN-... DLL文件,发现它们实际上应该已经是Windows 7的一部分(一些网站声称它们属于Windows 8和Windows Server 2012)。
我已经尝试了我找到的建议修复方法,包括:
- 运行 'sfc /scannow'
- 安装Visual Studio 2008 SP1运行时可执行文件
但是这些都没有解决任何问题。 🙁
附注:我的开发机也没有这些文件,并且似乎也不需要它们。例如,我的机器上的user32.dll没有连接到其中之一,而在VMware上的安装却有。
有没有办法解决这个问题?
我试图在微软的页面上找到适当的下载/修复方法,但是失败了。
解决了我的问题后,我想报告一下我发现的情况,但是我不能将这个作为答案发表,因为问题已经关闭了。
实际上,Dependency Walker工具报告的所有丢失的DLL文件,即那些
* API-MS-WIN-CORE-...
类型的DLL文件并不是实际问题的一部分。
在我的情况下,三个OCX文件的注册丢失了,之后一切都正常了,但是Dependency Walker工具仍然列出了所有相同的DLL文件,即使程序现在运行正常。
要点是:正如其他人所说,该工具现在有点过时,不一定在新的操作系统上工作正常。因此请保持警觉,不要被缺少的 'API-MS-WIN-CORE-COM-L1-1-0.DLL' 等问题所误导,问题可能完全出在其他地方。
文章内容如下:
这个问题与缺少Visual Studio的"redistributable package"有关。根据依赖关系,很难确定缺少的是哪个版本,但是建议首先尝试与编译器版本对应的版本,看看是否能正常运行:
Visual Studio 2015
Visual Studio 2013
Visual Studio 2010
Visual Studio 2008
我遇到了这个问题,因为我正在使用Visual Studio编译器,但没有完整的Visual Studio环境。
另外一个可能的解决方法是安装最新支持的Visual C++下载。参考链接:The latest supported Visual C++ downloads。
还有一个可能引起这个问题的原因是在某些版本的Windows 7上安装了可分发包。感谢微软。
我也遇到了这个问题,并且相信有多种方法可以解决它。在我的情况下,我注意到使用调试配置会导致我的com dll无法注册。然而,当我将配置更改为发布时,我能够进行干净的注册。我的环境是VS 2012。我确实将正确的redist(x64版本)文件复制到与我的com dll相同的文件夹中。
一些较新的Windows SDK / DDK也带有其中一些文件!
VS2015 vcredist_*.exe会安装这些DLL文件,但是其他方法,比如与VS一起提供的MSM文件,不会。vcredist包括这些DLL文件,并且您需要最低所需的平台。(请注意,我必须两次安装Windows 7 sp1才能生效 - WU欺骗了我!)参考链接:microsoft.com/en-us/download/details.aspx?id=48234
"VS 2015"难道不与旧版本兼容吗?
GCC突然停止工作?缺少依赖项?
在这种情况下,Dependency Walker是误导性的,并导致我浪费了时间。所以,第一个帖子中“缺失”的DLL文件列表是没有帮助的,你可以忽略它。
解决方法是找出你的项目调用的引用,并检查它们是否真的安装在服务器上。
Brammer,缺少的三个.ocx文件并不重要,因为它们只是Leo T Abraham项目缺少的。你的项目可能调用其他DLL文件。
在我的案例中,缺少的不是三个.ocx文件,而是缺少的MySQL连接器DLL文件。在服务器上安装MySQL Connector for .NET之后,问题消失了。
所以,简而言之,解决方法是:检查你的项目引用是否都在那里。
GCC突然停止工作?缺少依赖项?
在解决C++ Qt 5和Windows 7 64位与MSCVC 2012的相同问题时,我一开始认为是MSVC/Windows DLL文件的问题,但正如BorisP所说,问题出现在我的项目依赖项中。关键在于“如何知道你的Qt 5项目的依赖项?”。
因为我没有找到明确的方法来知道它(依赖关系分析器没有帮助我很多...),我遵循了下面的“逆向过程”,只需不超过5分钟,就能避免很多与DLL文件依赖项相关的头痛问题:
编译你的项目并将可执行文件放到一个空文件夹中:myproject.exe
尝试执行它,会出现一个错误(缺少DLL文件...)。
现在,将Qt的所有DLL文件(在我的情况下,它们位于C:\Qt\Qt5.1.1\5.1.1\msvc2012_64_opengl\bin)复制到这个文件夹中。
再次尝试执行,它可能会正常工作。
开始逐渐删除并在每次可执行文件仍然正常工作时尝试,试图保留最少必要的DLL文件。
当你在同一个文件夹中拥有所有的DLL文件时,更容易找到哪些是无效的(XML、WebKit等等...),因此这种方法不会超过五分钟。
如果缺少的DLL是GAC程序集,这种方法将帮助你确定缺少哪些DLL(错误消息应该告诉你无法加载的程序集),然后你将不得不找出在机器上安装哪个工具包或框架来将它们放入GAC(或与你的发行版一起包含)。
这种方法只适用于在启动时加载的直接DLL依赖项。如果你的程序或DLL将延迟或动态加载一些DLL,你无法用这种方法找到它们。
还要注意,用这种方式会使你的应用程序对PATH变量的顺序敏感,在某些情况下加载系统版本,在其他情况下加载本地文件夹中的版本。微软称这是一个安全问题,但坦率地说,这是他们在加载时使用CWD的错:support.microsoft.com/en-us/kb/2389418
不应该手动执行此操作。有一个用于此的windeployqt工具,请参见例如stackoverflow.com/a/33292008/4023446
windeployqt经常复制不必要的文件。