qmake在生產項目中的應用實踐

qmake在生產項目中的應用實踐

qmake基礎語法

詳情參考[qmake手冊]1

入門參考cnblogs 一篇文章,
我們使用到的知識點有:

.pro中變量 含義 示例
TEMPLATE 模板變量指定生成makefile(app:應用程序/lib:庫) TEMPLATE = app
QT 使用到的Qt定義的類(core/gui/widgets…) QT += widgtes
DESTDIR 指定生成的應用程序放置的目錄 DESTDIR += …/bin
TARGET 指定生成的應用程序名 TARGET = hello
HEADERS 工程中包含的頭文件 HEADERS += hello.h
FORMS 工程中包含的.ui設計文件 FORMS += hello.ui
SOURCES 工程中包含的源文件 SOURCES += main.cpp hello.cpp
RESOURCES 工程中包含的資源文件 RESOURCES += qrc/hello.qrc
LIBS 引入的lib文件的路徑 -L:引入路徑 LIBS += -L.
CONFIG 用來告訴qmake關於應用程序的配置信息 CONFIG+= qt warn_on release
UI_DIR 指定.ui文件轉化成ui_*.h文件的存放目錄 UI_DIR += forms
RCC_DIR 指定將.qrc文件轉換成qrc_*.h文件的存放目錄 RCC_DIR += …/tmp
MOC_DIR 指定將含Q_OBJECT的頭文件轉換成標準.h文件的存放目錄 MOC_DIR += …/tmp
OBJECTS_DIR 指定目標文件(obj)的存放目錄 OBJECTS_DIR += …/tmp
DEPENDPATH 程序編譯時依賴的相關路徑 DEPENDPATH += . forms include qrc sources
INCLUDEPATH 頭文件包含路徑 INCLUDEPATH += .
DEFINES 增加預處理器宏(gcc的-D選項) DEFINES += USE_MY_STUFF
QMAKE_CFLAGS 設置c編譯器flag參數 QMAKE_CFLAGS += -g
QMAKE_CXXFLAGS 設置c++編譯器flag參數 QMAKE_CXXFLAGS += -g
QMAKE_LFLAGS 設置鏈接器flag參數 QMAKE_LFLAGS += -rdynamic

1. TEMPLATE變量

生成Makefile採用的模板。以下是可供選擇的模板:

  • app:建立一個應用程序Makefile,這個也是默認值,沒有指定模板是默認是這個。
  • lib:建立一個庫的Makefile。
  • vcapp:建立一個應用程序的visual studio項目文件。
  • vclib:建立一個庫的visual studio項目文件。
  • subdirs:創建一個能夠進入子目錄並且爲之生成爲它調用make的Makefile。需要在後面用SUBDIRS=XX來指定那些子目錄。

2. CONFIG變量

  • 控制編譯器標誌的選項:

    • release:應用程序將以release模式連編,如果“debug”被指定,它將被忽略。
    • debug:應用程序將以debug模式連編。
    • warn_on:編譯器會輸出儘可能多的警告信息,如果“warn_off”被指定,它將被忽略。
    • warn_off:編譯器會輸出儘可能少的警告信息。
  • 控制需要連接的庫的選項:

    • qt:應用程序是一個Qt應用程序,並且Qt庫將會被鏈接。
    • thread:應用程序是一個多線程程序。
    • x11:應用程序是一個x11應用程序或者庫。
    • windows:只用於app模板,應用程序是一個windows下的窗口應用程序。
    • console:只用於app模板,應用程序是一個windows下的控制檯應用程序。
    • dll:只用於lib模板,庫是一個共享庫。
    • staticlib:只用於lib模板,庫是一個靜態庫。
    • plugin:只用於lib模板,庫是一個插件,這將會使dll選項生效。
    • 例如:CONFIG += qt debug,使用qt庫的應用程序,debug版本。
  • 注意事項:必須使用“+=”,不要使用“=”,否則原來的設置會被清除。

3. 變量用法:

  • 自定義變量:

MY_VARIABLE = value

定義了一個變量MY_VARIABLE,並將值設置爲value。

  • 變量值的傳遞:

可以通過在其它任何一個變量的變量名前加$$來把這個變量的值分配給當前的變量。例如:

MY_DEFINES = $$DEFINES

MY_DEFINES = $${DEFINES}

4. qmake系統變量

  • HEADERS:需要包含的頭文件的列表。
  • SOURCES:需要的源文件的列表。
  • FORMS:需要的.ui文件的列表。
  • LEXSOURCES:所有lex源文件的列表。
  • YACCSOURCES:所有yacc源文件的列表。
  • TARGET:可執行應用程序的名稱。默認值爲項目文件的名字。
  • DESTDIR:放置可執行程序目標的目錄。
  • OBJECTS_DIR:放置obj中間文件的目錄。
  • MOC_DIR: moc轉換文件路徑。
  • RCC_DIR: 資源文件路徑。
  • UI_DIR:ui文件轉換的路徑。
  • RESOURCES:需要包含的資源文件。
  • LIBS:依賴庫的路徑和名稱 -L{xxdirxx} -l{xxnamexx}。
  • LIBEXT: 產生lib的後綴。
  • DEFINES:應用程序所需的額外的宏定義列表。
  • INCLUDEPATH:應用程序所需的額外的包含路徑列表。
  • DEPENDPATH:應用程序所依賴的搜索路徑。
  • VPATH:尋找補充文件的搜索路徑。
  • DEF_FILE:只有Windows需要:應用程序所要連接的.def文件。
  • RC_FILE:只有Windows需要:應用程序的資源文件。
  • RES_FILE:只有Windows需要:應用程序所要連接的資源文件。
  • TRANSLATIONS: 多國語言支持文件。
  • INSTALLS: 要安裝的文件。
  • target.path: 安裝的路徑。

詳細請參考Qt幫助條目:[qmake變量參考]2

5. subdirs模板

subdirs模板告訴qmake生成一個makefile,它可以進入到特定子目錄併爲這個目錄中的項目文件生成makefile並且爲它調用make。這個模板只有一個系統變量SUBDIRS可以被識別。

SUBDIRS:這個變量中包含了所要處理的含有項目文件的子目錄的列表。這個項目文件的名稱是和子目錄同名的,這樣qmake就可以發現它。例如,如果子目裏是"subapp",那麼在這個目錄中的項目文件應該被叫做 subapp.pro

實戰開發

下面介紹從現有項目生成qmake項目管理文件pro過程

  1. 進入項目所在路徑

qmake -project會自動生成項目文件 app.pro

這裏生成的項目文件並不是我們期望的,接下來修改 app.pro 文件內容

添加 Qt庫支持等一些配置:

QT += core widgets network xml sql webenginewidgets
TEMPLATE = app
CONFIG += console

include($$PWD/common.pri)

  1. 配置輸出路徑等:
DESTDIR += ./build/$$PLATFORM/bin
RCC_DIR += ./build/$$PLATFORM/tmp/rcc
UI_DIR  += ./build/$$PLATFORM/tmp/ui

CONFIG(debug, debug|release) {
    MOC_DIR += ./build/$$PLATFORM/tmp/moc/debug
    OBJECTS_DIR += ./build/$$PLATFORM/tmp/obj/debug
}
CONFIG(release, debug|release) {
    MOC_DIR += ./build/$$PLATFORM/tmp/moc/release
    OBJECTS_DIR += ./build/$$PLATFORM/tmp/obj/release
}
  1. 另外我們需要使用預編譯頭
CONFIG +=precompile_header
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
    DEFINES += USING_PCH
}
# Use Precompiled headers (PCH)
PRECOMPILED_HEADER = stdafx.h

詳細參考[qmake預編譯頭]3

  1. 接下來正常操作添加頭文件、庫路徑等
$$PROJECT_DIR = $$PWD/src
INCLUDEPATH += $$PROJECT_DIR
HEADERS += $$files($$PROJECT_DIR/*.h, true)
SOURCES += $$files($$PROJECT_DIR/*.cpp, true)

FORMS += $$files($$PROJECT_DIR/UI/*.ui, true)
RESOURCES += $$PROJECT_DIR/Resource/*.qrc
TRANSLATIONS += $$PROJECT_DIR/Resource/*.ts

LIBS += -L./lib -llibcurl -llibeay32 -lssleay32 -lsqlite3 -lzdll
  1. windows下添加圖標、manifest資源文件等
win32 {
    RC_FILE = $$PROJECT_DIR/Resource/resource.rc
}

  1. https://doc.qt.io/qt-5/qmake-manual.html ↩︎

  2. https://doc.qt.io/qt-5/qmake-variable-reference.html#pro-file-pwd ↩︎

  3. https://doc.qt.io/qt-5/qmake-precompiledheaders.html ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章