动态库使用的细节

一、gcc 编译器

.exe 在编译的时候,需要自己包含对应的导入库(xxx.dll.a)
.exe 在运行的时候,需要根据 Path 环境变量来找到对应的 dll 库文件。
在这里插入图片描述

1、配置 .exe 程序,编译时候的链接配置

与上一个配置环境变量的作用不同,这个是指导 程序的链接过程,是否能找到对应的动态库。

.pro 文件是Qt项目的主配置文件。(相当于 linux 当中的 makefile 文件,用来指导编译)

image-20211020171747176

# 包含了core、gui两个模块
QT       += core gui

# 高于4版本,就包含widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

# 源代码
SOURCES += \
    main.cpp \
    mainwindow.cpp

# 头文件
HEADERS += \
    mainwindow.h

# ui文件
FORMS += \
    mainwindow.ui

修该 .pro 文件,以便于我们的项目支持 ffmpeg 的库函数

  • 这个 .pro 文件的配置,是指导程序编译的时候,可以找到对应的动态库。之前配置的环境变量,是指导 windows 运行程序的时候,可以找到对应的动态库。
  • INCLUDEPATHLIBS、是 QT 内部自己定义的环境变量。用来存放头文件路径、库文件路径。
  • FFMPEG_HOME :我们自己定义的变量,用来标记我们的主目录。
win32: {
    FFMPEG_HOME=D:\SF\ffmpeg\MJ\ffmpeg-4.3.2-2021-02-27-full_build-shared
    #设置 ffmpeg 的头文件
    INCLUDEPATH += $$FFMPEG_HOME/include

    #设置导入库的目录一边程序可以找到导入库
    # -L :指定导入库的目录
    # -l :指定要导入的 库名称
    LIBS +=  -L$$FFMPEG_HOME/lib \
             -lavcodec \
             -lavdevice \
             -lavfilter \
            -lavformat \
            -lavutil \
            -lpostproc \
            -lswresample \
            -lswscale
}
  • # 号后面的内容是注释

  • $$FFMPEG_HOME 表示对环境变量值的引用,相当于原地展开。

  • -L:设置导入库的目录,以便编译器能够找到导入库。(exe 程序编译的时候只需要包含 xxx.dll.a 静态导入库,运行的时候才需要 xxx.dll 文件)

  • -l:设置需要链接的导入库名称

    • 导入库名称需要去掉文件名前面的lib,比如 libavcodec.dll.a 就写成 avcodec

2、配置 .exe 程序,运行的时候搜寻 dll 文件

  • 指导 windows 程序运行的时候,是否可以找到对应的动态链接库。

exe在寻找dll文件时,大概按照以下优先级顺序去查找(这里只列出了大概的搜索路径,并没有写全):

  1. xxx.exe 自己所在的目录
    在这里插入图片描述

  2. Windows的System目录

    • C:/Windows/System
    • C:/Windows/System32
  3. Windows目录

    • C:/Windows
  4. 环境变量Path中的路径

    • 所以可以考虑将 %FFMPEG_HOME%/bin 目录配置到 Path 变量中
    • 置于如何配置Windows的环境变量Path,这是基本开发常识了,就不再讲解了
      在这里插入图片描述

第1种方式需要在每一个Qt程序中都拷贝一份FFmpeg的dll文件。

第2~4种方式可以让多个Qt程序共用同一份FFmpeg的dll文件。


二、微软编译器

VS 使用的就是微软编译器,其中

  • 导入库后缀:xxx.lib,编译的时候需要包含到 exe 程序当中。
  • 动态库: xxx.dll ,运行的时候需要可以找到这个文件,配置 PATH 环境变量。

1、编译时候的配置

解析下面的配置:
在这里插入图片描述
包含目录:头文件的路径
在这里插入图片描述
库目录:导入库的路径。(静态库
在这里插入图片描述
在这里插入图片描述

链接器,附加依赖项:

  • xxxd.lib :指定库的名称,代表 debug 模式。
    在这里插入图片描述

2、运行时候的配置

xxx.dll 文件才是真正存放函数体的地方,运行的时候会跳转到动态库来执行程序。
在这里插入图片描述
配置环境变量,让 xxx.exe 程序执行的时候,可以找到动态库 xxx.dll
在这里插入图片描述
补充:还有其他三种办法,可以让 .exe 程序运行的时候,找到对应 dll 文件

  • 将 dll 文件,放到当前 exe 文件同一目录下面。
  • 放到 Windows 默认搜寻的目录下面: C:\WindowsC:\Windows\System32C:\Windows\SysWOW64
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想文艺一点的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值