由于找不到 XXX.dll,无法继续执行代码。重新安装程序可能会解决此问题——解决方案

由于找不到 XXX.dll,无法继续执行代码。重新安装程序可能会解决此问题——解决方案

一、问题描述

之前项目都是在Ubuntu操作系统下完成,进行的很顺利。由于我没有Linux物理机,每次都要打开虚拟机感觉挺麻烦的,我就想着把在Linux上能做的工作都转移到Windows上来。

作者在Windows下使用MSYS2 MINGW64完成了FFmpeg的编译,我的目的是用C++做音视频开发,所以程序中按以下方式引用了FFmpeg的头文件:

extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavutil/pixfmt.h"
#include "libswscale/swscale.h"
}

编译程序编译命令如下:

g++ fm.cpp -o fm.exe -I "$basepath/lib/include" -L "$basepath/lib/lib" -lavformat -lavcodec -lavutil -lswscale -fexec-charset=UTF-8

程序编译成功后,我双击fm.exe文件运行,就出现了如下报错:

在这里插入图片描述

二、问题溯源

dll文件是Windows操作系统中的一种共享库文件,许多程序在运行时需要这些文件。以下是一些可能的原因:

  1. 文件损坏或缺失:dll文件可能已损坏或从系统中丢失。
  2. 注册表问题:dll文件可能没有正确注册到Windows注册表中。
  3. 版本不兼容:安装的程序可能需要特定版本的dll,而系统中的版本不兼容。
  4. 路径问题:系统可能无法在正确的路径找到所需的dll文件。
  5. 病毒或恶意软件:某些病毒或恶意软件可能会删除或损坏dll文件。

在我的问题描述中,出现的错误经查是dll文件系统找不到,究其原因是

  • 路径问题

所谓路径问题是指,Windows会在一系列系统默认的路径中查找相应的dll文件,如果系统默认的路径中不存在系统将继续在用户添加的环境变量路径中查找。如果最终都未找到,则会出现今天我们看到的错误。

从以上分析中,我们得到启发,最少有两种方法来解决这个问题:

  1. 将dll文件复制到系统的默认查找目录下;
  2. 将dll文件所在目录的路径设置为系统环境变量。

三、解决方案

3.1 方案1——拷贝dll文件到系统目录

首先,我们明确一下,操作系统最先查找的目录是:

C:\Windows\System32

那么我们只需要将dll文件复制到该目录即可,拷贝过后你将发现程序已经能正常运行。

可以手动拷贝,也可以用命令拷贝,下面给出用命令(copy)拷贝的方法。

  • 检查dll文件是否为所期待的dll文件

    使用dir命令显示dll文件所在文件夹的所有dll文件,具体命令格式为:

    dir 文件夹路径/*.dll /a
    
    • *.dll表示匹配指定路径下所有dll类型文件
    • /a表示显示详细信息

    我的操作实例如下

    D:\ToolChainlib\FFmpeg\ffmpeg-lib\bin>dir *.dll /a
     驱动器 D 中的卷是 Data
     卷的序列号是 C2EF-215E
    
     D:\ToolChainlib\FFmpeg\ffmpeg-lib\bin 的目录
    
    2024/06/06  02:17        13,936,128 avcodec-58.dll
    2024/06/06  02:17           143,872 avdevice-58.dll
    2024/06/06  02:17         3,533,312 avfilter-7.dll
    2024/06/06  02:17         2,375,168 avformat-58.dll
    2024/06/06  02:17           620,032 avutil-56.dll
    2024/06/06  02:17           123,392 swresample-3.dll
    2024/06/06  02:17           564,224 swscale-5.dll
                   7 个文件     21,296,128 字节
                   0 个目录 293,111,025,664 可用字节
    

    由于我的控制台位置(D:\ToolChainlib\FFmpeg\ffmpeg-lib\bin)就是dll文件所在的目录,因此dir命令的参数就不需要写路径了,直接写文件名(*.dll)即可

  • 拷贝文件

    命令格式为:

    copy 源文件夹路径 目标文件夹路径 /Y
    
    • /y表示如果拷贝过去遇到了同名文件则覆盖;如果读者不想覆盖的话直接删除/y即可。

    我的操作实例如下

    D:\ToolChainlib\FFmpeg\ffmpeg-lib\bin>copy *.dll C:\Windows\System32 /y
    avcodec-58.dll
    avdevice-58.dll
    avfilter-7.dll
    avformat-58.dll
    avutil-56.dll
    swresample-3.dll
    swscale-5.dll
    已复制         7 个文件。
    
3.2 方案2——设置环境变量

首先确定dll文件所在的目录路径,比如我的dll文件所在目录路径为:

D:\ToolChainlib\FFmpeg\ffmpeg-lib\bin

确定路径后,按照下面的指引完成环境变量配置:

  • 用系统的搜索工具,搜索环境变量

  • 在打开的窗口中点击”环境变量

  • 在打开的窗口中找到”Path“,选中后单击”编辑

  • 在新窗口中创建一个条目然后粘贴我们的路径即可,最后确定即可。

3.3 测试

这下没问题了,万能Hello World!,祝我好运。

四、心灵的救赎

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值