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
}