QT工程的pro文件詳解


爲了在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_xxx
  • UI_DIR:UIC將ui轉化爲頭文件所存放的目錄
  • RCC_DIR:RCC將qrc文件轉化爲頭文件所存放的目錄
  • MOC_DIR:MOC命令將含Q_OBJECT的頭文件轉換爲標準的頭文件存放的目錄
  • OBJECTS_DIR:生成的目標文件存放的目錄
  • RC_FILE :程序中所用到的圖片等資源文件
  • CODECFORSRC:源文件編碼方式GBK,UTF-8
  • TRASHLATIONS:加載要用到的語言翻譯*.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_DEBUGQMAKE_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_DEBUGQMAKE_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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章