项目背景:MFC工程在新的电脑上使用,搭建环境的过程中遇见了dll文件缺失的问题,导致能够编译通过但无法运行。在此过程中主要缺失的dll文件有:
- opencv的 opencv_core249.dll,opencv_highgui249d.dll,opencv_imgproc249d.dll
- PCL的 pcl_common_debug.dll,pcl_visualization_debug.dll等
- MFC对于C++运行的 mfc42d.dll msvcrtd.dll msvcp100d.dll msvcr100d.dll msvcp120.dll msvcr120.dll
解决办法:针对各自缺失的情况不同,给出了不同的解决办法
- opencv是本项目必须依赖的库,其本身存在,但单独放置在一个项目目录 $(ProjectDir) 目录下的文件夹DLL内,不与目标文件(.exe)在同一目录下,导致程序运行或调试时无法检索到它。解决办法为:在属性>>调试>>环境中增加PATH=$(ProjectDir)DLL(务必写PATH=,不同路径之间可以用分号隔开)。
- PCL的dll依赖是由于工程项目中其他的库使用了dll而产生的,在项目的属性页和包含文件中已经体现不出PCL的使用痕迹了。只有在程序编译成功并运行后,才会提示对PCL的对应DLL文件的需求。并且尤为重要的是他在编写该库时使用的是特定版本的PCL库,不链接对应版本的DLL库,会导致报错“应用程序无法正常启动0xc000007b”(这是DLL内部错误,如版本不兼容等导致的)。解决办法为:解除对相应库的依赖,具体步骤见下文。
- MFC的库的依赖是由于项目历史原因导致的,项目最初是使用VC6.0编写的,后续逐渐演化为使用Visual Studio2015和2022,这就导致了当时编写的一些库会对之前版本DLL文件保留了隐式的依赖。(如msvcr100d.dll和msvcp100d.dll是visual studio2010所依赖的微软学习关于C++在发行版本支持的下载,而msvcp120.dll和msvcr120.dll是visual studio2013版本所依赖的,也就是说如果你已经安装了这两个版本的visual studio的话一般是不会发生这个问题的)(mfc42d.dll和msvcrtd.dll是VC6.0的依赖,同理安装过VC6.0编译器的电脑也不会发生这个问题)。解决办法为:下载对应的DLL文件,放到指定位置。如果运行debug(x32)版本在64位系统上,
需要将32位版本的mfc42d.dll msvcrtd.dll msvcp100d.dll msvcr100d.dll msvcp120.dll msvcr120.dll
放在C:\Windows\SysWOW64路径下,而非C:\Windows\System32路径下。
隐式包含:指不在项目属性的任何目录(包含目录、附件包含目录、附加库目录、附加依赖项)可见其被使用,但由于其他被封装的库或者插件的使用隐式地对其DLL依赖。(通常来说LIB可以被打包到exe中,而DLL通常会保留在外,所以程序的运行会依赖很多DLL,规范的程序往往能很好地处理各个版本之间的兼容问题)。
应用程序无法正常启动0xc000007b的可能原因:
-
缺失或损坏的DLL文件:应用程序可能依赖于某些动态链接库(DLL)文件,如果这些文件丢失或损坏,就会导致应用程序无法正常启动。>>检查应用程序所需的DLL文件是否完整且位于正确的位置,必要时可以尝试重新安装应用程序或相关的软件包。
-
版本不兼容:应用程序可能与操作系统或其他软件之间存在版本不兼容的问题,从而导致应用程序崩溃。>>确认应用程序与操作系统及其他软件之间的版本兼容性,必要时可以尝试更新相关软件。
-
系统文件损坏:Windows系统文件可能由于各种原因而损坏,影响应用程序的正常运行。
-
硬件问题:应用程序的崩溃可能与底层硬件存在问题有关,如内存故障、硬盘错误等。
在MFC编程解除对该库的依赖:
-
从项目中删除对库的引用:
- 在"附加包含目录"框中,删除库的包含目录路径。
- 在"附加库目录"框中,删除库的库目录路径。
- 在"附加依赖项"框中,删除库的依赖项。
-
从代码中删除对PCL库的使用:
- 查找并删除所有包含头文件的地方,如
#include <pcl/point_cloud.h>
- 删除所有涉及的类型、函数或变量的代码,如
pcl::PointCloud<pcl::PointXYZ> cloud
- 查找并删除所有包含头文件的地方,如
-
从预编译头文件中删除相关内容:如果项目使用预编译头文件(通常命名为
stdafx.h
或pch.h
),请检查并删除其中与PCL相关的任何包含或定义。 -
从链接器设置中删除库:
- 在项目属性页的"链接器" > "常规"选项卡中,删除库的链接器输入。
- 在"链接器" > "输入"选项卡中,删除库的附加依赖项。
-
检查并删除任何与PCL相关的预处理器定义:在项目属性页的"C/C++" > "预处理器"选项卡中,检查并删除任何相关的预处理器定义,如
PCL_USE_POINT_CLOUD_L1
。
完成上述步骤后,您的MFC项目应该已经成功解除了对PCL库的依赖。确保在删除这些依赖项后,您的代码中不再使用任何PCL相关的功能或类型。