动态库使用的细节

Posted 想文艺一点的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态库使用的细节相关的知识,希望对你有一定的参考价值。

一、gcc 编译器

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

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

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

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

# 包含了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

以上是关于动态库使用的细节的主要内容,如果未能解决你的问题,请参考以下文章

基础 IO(细节感拉满)

基础 IO(细节感拉满)

Java动态代理

第5章 面对Windows开发的基本实现

slighttpd基于lighttpd架构的Server项目实战(10)—插件&动态库

Python 标准库 urllib2 的使用细节