关于项目“隐式包含”库但缺乏对应DLL文件导致的错误

 项目背景:MFC工程在新的电脑上使用,搭建环境的过程中遇见了dll文件缺失的问题,导致能够编译通过但无法运行。在此过程中主要缺失的dll文件有: 
  1. opencv的 opencv_core249.dll,opencv_highgui249d.dll,opencv_imgproc249d.dll
  2. PCL的 pcl_common_debug.dll,pcl_visualization_debug.dll等
  3. MFC对于C++运行的 mfc42d.dll msvcrtd.dll msvcp100d.dll msvcr100d.dll msvcp120.dll msvcr120.dll

解决办法:针对各自缺失的情况不同,给出了不同的解决办法
  1. opencv是本项目必须依赖的库,其本身存在,但单独放置在一个项目目录 $(ProjectDir) 目录下的文件夹DLL内,不与目标文件(.exe)在同一目录下,导致程序运行或调试时无法检索到它。解决办法为:在属性>>调试>>环境中增加PATH=$(ProjectDir)DLL(务必写PATH=,不同路径之间可以用分号隔开)
  2. PCL的dll依赖是由于工程项目中其他的库使用了dll而产生的,在项目的属性页和包含文件中已经体现不出PCL的使用痕迹了。只有在程序编译成功并运行后,才会提示对PCL的对应DLL文件的需求。并且尤为重要的是他在编写该库时使用的是特定版本的PCL库,不链接对应版本的DLL库,会导致报错“应用程序无法正常启动0xc000007b”(这是DLL内部错误,如版本不兼容等导致的)。解决办法为:解除对相应库的依赖,具体步骤见下文。
  3. 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的可能原因:
  1. 缺失或损坏的DLL文件:应用程序可能依赖于某些动态链接库(DLL)文件,如果这些文件丢失或损坏,就会导致应用程序无法正常启动。>>检查应用程序所需的DLL文件是否完整且位于正确的位置,必要时可以尝试重新安装应用程序或相关的软件包。

  2. 版本不兼容:应用程序可能与操作系统或其他软件之间存在版本不兼容的问题,从而导致应用程序崩溃。>>确认应用程序与操作系统及其他软件之间的版本兼容性,必要时可以尝试更新相关软件。

  3. 系统文件损坏:Windows系统文件可能由于各种原因而损坏,影响应用程序的正常运行。

  4. 硬件问题:应用程序的崩溃可能与底层硬件存在问题有关,如内存故障、硬盘错误等。


在MFC编程解除对该库的依赖:
  1. 从项目中删除对库的引用:

    • 在"附加包含目录"框中,删除库的包含目录路径。
    • 在"附加库目录"框中,删除库的库目录路径。
    • 在"附加依赖项"框中,删除库的依赖项。
  2. 从代码中删除对PCL库的使用:

    • 查找并删除所有包含头文件的地方,如#include <pcl/point_cloud.h>
    • 删除所有涉及的类型、函数或变量的代码,如pcl::PointCloud<pcl::PointXYZ> cloud
  3. 从预编译头文件中删除相关内容如果项目使用预编译头文件(通常命名为stdafx.hpch.h),请检查并删除其中与PCL相关的任何包含或定义。

  4. 从链接器设置中删除库:

    • 在项目属性页的"链接器" > "常规"选项卡中,删除库的链接器输入。
    • 在"链接器" > "输入"选项卡中,删除库的附加依赖项。
  5. 检查并删除任何与PCL相关的预处理器定义:在项目属性页的"C/C++" > "预处理器"选项卡中,检查并删除任何相关的预处理器定义,如PCL_USE_POINT_CLOUD_L1

完成上述步骤后,您的MFC项目应该已经成功解除了对PCL库的依赖。确保在删除这些依赖项后,您的代码中不再使用任何PCL相关的功能或类型。


  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值