爲了在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