为了在QT工程中添加第三方库的使用,因此必须要在pro文件中进行添加,增加库文件的声明,包含路径、编译选项等,那么就需要对pro文件有一个详细的了解,并知道如何修改与添加。本文是为了在QT中使用FFmpeg库,作为铺垫,先行了解如何在QT中引入第三方库。
QT工程的pro文件解析
QT工程的pro文件,在创建工程时由QTCreater自动创建
简单的Pro文件示例
QT += core gui multimedia
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = myplayer
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
解释:
- 第一行:表明这个项目使用的模块。core模块包含了Qt的核心功能,其他所有模块都依赖于这个模块,而gui模块提供了窗口系统集成、事件处理、OpenGL和OpenGL ES集成、2D图形、基本图像、字体和文本等功能。
当使用qmake工具来构建项目时,core模块和gui模块是被默认包含的。multimedia是多媒体处理的模块,当需要处理音频与视频时,需要包含此模块 - 第二行:表明pro文件创建的版本,并添加模块widgets, 此模块在Qt Widgets模块中提供了经典的界面UI元素集合,QT的C++程序用户界面部件都在该模块中。
- 第三行:表明编译后生成的可执行文件的名称,在Windows版本下,生成后缀名为.exe的执行文件,自动创建pro文件时,此处默认为项目的名称,可以自行修改为另外的名称。
- 第四行:表明工程的编译模板类型,默认是app应用程序类型,另外比较常见的lib类型,表示编译为库文件形式。Qt 工程文件主要分为三种:app(单独的应用程序)、lib(静态和动态库)和 subdirs(递归编译);Subdirs 模版可以用来编译子目录里的目标文件。在这种情况下,除 TEMPLATE = subdirs 外还需要指定 SUBDIRS 变量。在每个子目录中,qmake 会搜寻以目录名命名的.pro文件,并且会编译该工程。
- 第五行:表明当前工程下的源代码文件
- 第六行:指定需要 uic 处理的由 Qt 设计师生成的 .ui 文件
PRO文件基本配置选项
QT
:指定工程所要使用的Qt模块VERSION
:指定目标库版本号TARGET
:指定编译后生成的目标文件名称TEMPLATE
:指定编译的工程类型SOURCES
:指定当前工程中的C++代码文件HEADERS
:指定C++代码的头文件FORMS
:指定需要uic处理的ui文件RESOURCES
:指定需要rcc处理的qrc文件INCLUDEPATH
:指定C++编译器搜索头文件路径LIBS
:指定工程要链接的库;可以通过绝对路径指定(/usr/local/lib/libavformat.so),也可以使用源自 UNIX 的 -L 和 -l 标识符来指定(-L/user/local/lib 和 -lavformat)DESTDIR
:指定可执行文件放置的目录DEPENDPATH
:程序编译时依赖的相关路径CONFIG
指定各种用于工程配置和编译的参数,支持一下配置
(1) debug 是指编译具有调试信息的可执行文件或库,链接调试版的 Qt 库。
(2) release 是指编译不具有调试信息的可执行文件和或库,链接发行版的 Qt 库。如果同时制定 debug 和 release,则 debug 有效。
(3) warn_off 会关闭大量的警告。默认情况下,警告的状态是打开的。
(4) qt 是指应用程序或库使用 QT,这一选项是默认包括的。
(5) dll 是指动态编译库。
(6) staticlib 是指静态编译库。
(7) plugin 是指编译一个插件,插件总是动态库,因此这一参数暗指 dll 参数。
(8) console 是指应用程序需要写控制台(使用 cout,cerr,qWarning(),等等)DEFINES
:指定预定义预处理器符号,例如DEFINES = XX_XX_XXX ,定义编译选项,在.h文件中就可以使用 :#ifdefine xx_xx_xxxUI_DIR
:UIC将ui转化为头文件所存放的目录RCC_DIR
:RCC将qrc文件转化为头文件所存放的目录MOC_DIR
:MOC命令将含Q_OBJECT的头文件转换为标准的头文件存放的目录OBJECTS_DIR
:生成的目标文件存放的目录RC_FILE
:程序中所用到的图片等资源文件CODECFORSRC
:源文件编码方式GBK,UTF-8TRASHLATIONS
:加载要用到的语言翻译*.ts文件
当在不同的平台上编译工程时,可能有必要基于平台指定不同的文件或者不同的参数。 qmake 的条件判断语法是:
condition
{
then-case
}
else
{
else-case
}
//else 分支是可选的,当 then-case 部分仅有一条变量赋值,而且在没有 else-case 分支时,qmake 也支持单行形式的语法:
condition:then-case
condition 部分可以是平台名字,例如,win32、unix 或者 macx,或者更复杂的断言条件。then-case 和 else-case 部分使用标准语法为变量赋值。
QT是跨平台的,在不同的平台上用同一个pro文件,这要加入有关平台的信息。windows平台是win32,Linux平台是unix。在Windows和Linux的动态库文件格式是不一样的,一个是lib文件,一个是so文件,需要使用如下方式进行包含
win32:LIBS+= libavformat.lib
unix:LiBS+= libavformat.so
再如:
win32{SOURCES+= main.cpp }
unix{SOURCES+= main.cpp }
添加配置选项
常用的配置编译选项
QMAKE_LFLAGS
:QT工程的链接选项集合QMAKE_CC
:指定工程中C代码的编译器,默认在PATH环境变量指定的路径中查找QMAKE_CFLAGS
:指定工程中C代码编译的标志位,此变量设置在debug与release模式下都有效,若需要在debug与release模式下分别设置编译标志位,则需要使用QMAKE_CFLAGS_DEBUG
与QMAKE_CFLAGS_RELEASE
QMAKE_CFLAGS_WARN_ON
:此选项仅在CONFIG选项中设置warn_on时有效,表示打开编译C代码警告,关闭警告使用QMAKE_CFLAGS_WARN_OFF
QMAKE_CFLAGS_SHLIB
:此选项尽在Linux系统有效,表示C代码编译为库文件时标志位,一般不需要修改QMAKE_CFLAGS_THREAD
:编译C 代码多线程应用的标志位QMAKE_CXX
:指定工程中C++代码的编译器,默认在PATH环境变量指定的路径中查找QMAKE_CXXFLAGS
:指定工程中C++代码编译的标志位,此变量设置在debug与release模式下都有效,若需要在debug与release模式下分别设置编译标志位,则需要使用QMAKE_CXXFLAGS_DEBUG
与QMAKE_CXXFLAGS_RELEASE
QMAKE_CXXFLAGS_WARN_ON
:表示打开编译C++警告,关闭警告使用QMAKE_CXXFLAGS_WARN_OFF
QMAKE_CXXFLAGS_SHLIB
:此选项尽在Linux系统有效,表示编译为库文件时标志位,一般不需要修改QMAKE_CXXFLAGS_THREAD
:编译C++ 代码多线程应用的标志位
QMAKE 变量操作简介
QMAKE_CXXFLAGS = XXX 为QMAKE_CXXFLAGS赋值,当 '=’后面为空时,表示清空QMAKE_CXXFLAGS,推荐采用第二种方式,这样可以不影响其原有的值,在原基础上添加一个值
QMAKE_CXXFLAGS += XXX,在原基础上添加一个值
QMAKE_CXXFLAGS -= XXX,在原基础上删除一个值
pro文件引入FFmpeg第三方库
示例为引入FFmpeg第三方库,工程的pro文件如下:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QT_ffmpeg_avplayer
TEMPLATE = app
# ffmpeg
FFMPEG_INCLUDE = /usr/local/include
FFMPEG_LIB = /usr/local/lib
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += c++11
SOURCES += \
main.cpp \
qt_ffmpeg_avpalyer.cpp
HEADERS += \
qt_ffmpeg_avpalyer.h
FORMS += \
qt_ffmpeg_avpalyer.ui
INCLUDEPATH += $$FFMPEG_INCLUDE
LIBS += $$FFMPEG_LIB/libavcodec.so \
$$FFMPEG_LIB/libavdevice.so \
$$FFMPEG_LIB/libavfilter.so \
$$FFMPEG_LIB/libavformat.so \
$$FFMPEG_LIB/libavutil.so \
$$FFMPEG_LIB/libswresample.so \
$$FFMPEG_LIB/libswscale.so
#QMAKE_CFLAGS += -Wno-deprecated-declarations
QMAKE_CXXFLAGS += -Wno-deprecated-declarations