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過程
- 進入項目所在路徑
qmake -project會自動生成項目文件 app.pro
這裏生成的項目文件並不是我們期望的,接下來修改 app.pro 文件內容
添加 Qt庫支持等一些配置:
QT += core widgets network xml sql webenginewidgets
TEMPLATE = app
CONFIG += console
include($$PWD/common.pri)
- 配置輸出路徑等:
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
}
- 另外我們需要使用預編譯頭
CONFIG +=precompile_header
precompile_header:!isEmpty(PRECOMPILED_HEADER) {
DEFINES += USING_PCH
}
# Use Precompiled headers (PCH)
PRECOMPILED_HEADER = stdafx.h
詳細參考[qmake預編譯頭]3
- 接下來正常操作添加頭文件、庫路徑等
$$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
- windows下添加圖標、manifest資源文件等
win32 {
RC_FILE = $$PROJECT_DIR/Resource/resource.rc
}