一、概述
项目管理(pro)文件是对整个工程的配置,例如工程里包含哪些文件,路径是什么;以来哪些库,路径是什么;使用了Qt的哪些组件等等,实现自动化编译。
二、pro常用关键字的含义
2.1 QT
指定工程中使用的Qt的模块。默认情况下会使用Qt 的core和gui模块。
QT += core gui
2.2 TARGET
指定所生成.可执行文件名称。
TARGET = myOpencvTest1
TEMPLATE = app
2.3 DEFINES
qmake添加这个变量的值作为编译器C预处理器宏(-D选项)。
例如:
DEFINES += USE_MY_STUFF
然后就可以在代码中使用:
#ifdef USE_MY_STUFF
// TODO
#else
// TODO
#endif
VS中也有类似的全局宏定义,在.dll工程中经常用到,来指定是 dllexport 还是 dllimport .
DEFINES += FUNDLL_LIBRARY
在头文件中使用上述宏定义:
#if defined(FUNDLL_LIBRARY)
# define FUNDLLSHARED_EXPORT __declspec(dllexport)
#else
# define FUNDLLSHARED_EXPORT __declspec(dllimport)
#endif
2.4 SOURCES
工程中使用的所有源文件的名字(不包含路径)。
SOURCES += \
main.cpp \
dialog.cpp
2.5 HEADERS
工程中使用的所有头文件的名字(不包含路径)。
HEADERS += \
dialog.h
2.6 FORMS
列出工程中使用的UI文件(xml格式),这些文件会在编译之前被 uic(User Interface Compile,UI编译器) 处理。构建UI文件是所需的依赖项、头文件、源文件等都会自动被添加到工程中。
UIC会把 .ui(xml格式)文件转换成C++的 .h 文件(通常叫Ui_dialog.h)。其实是在.h文件里定义一个类,里面包含了UI文件中的所以元素/对象。
FORMS = mydialog.ui \
mywidget.ui \
myconfig.ui
2.7 INCLUDEPATH
列出工程中 #include 项需要搜索的路径,即头文件的路径。多个路径用空格隔开。
INCLUDEPATH = c:/msdev/include d:/stl/include
win32:INCLUDEPATH += "C:/mylibs/extra headers"
如果路径包含空格,需要使用引号包含。
win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"
2.8 DEPENDPATH
列出依赖项所在的路径。当处理included文件时会使用该项。
INCLUDEPATH += $$PWD/../mydll
DEPENDPATH += $$PWD/../mydll
2.9 PWD
表示当前.pro文件所在的路径。
INCLUDEPATH += $$PWD/../mydll
2.10 OUT_PWD
表示输出的“Makefile”所在的路径(通常在编译后生成的.exe文件的上层目录里)。
LIBS += -L$$OUT_PWD/../funDll/ -lfunDll
2.11 LIBS
指定链接到项目中的库列表。如果使用Unix -l (library) 和 -L (library path) 标志,在Windows上qmake正确处理库(也就是说,将库的完整路径传递给链接器),库必须存在,qmake会寻找-l指定的库所在的目录。
例如:
win32:LIBS += c:/mylibs/math.lib
unix:LIBS += -L/usr/local/lib -lmath
如果路径包含空格,需要使用引号包含路径。
win32:LIBS += "C:/mylibs/extra libs/extra.lib"
unix:LIBS += "-L/home/user/extra libs" -lextra
2.12 MOC_DIR
指定来自moc的所有中间文件放置的目录(含Q_OBJECT宏的头文件转换成标准.h文件的存放目录)。
例如:
unix:MOC_DIR = ../myproject/tmp
win32:MOC_DIR = c:/myproject/tmp
2.13 OBJECTS_DIR
指定所有中间文件.o(.obj)放置的目录。
例如:
unix:OBJECTS_DIR = ../myproject/tmp
win32:OBJECTS_DIR = c:/myproject/tmp
2.14 RCC_DIR
指定Qt资源编译器输出文件的目录(.qrc文件转换成qrc_*.h文件的存放目录)。
例如:
unix:RCC_DIR = ../myproject/resources
win32:RCC_DIR = c:/myproject/resources
2.14 RESOURCES
指定资源文件 (qrc) 的名称,参考:Qt之资源系统
例如:
RESOURCES += Resource/resource.qrc
2.15 RC_FILE
指定应用程序资源文件的名称。这个变量的值通常是由qmake或qmake.conf处理,很少需要进行修改。
例如:
RC_FILE += myapp.rc
2.16 RC_ICONS
仅适用于Windows,指定的图标应该包含在一个生成的.rc文件里。如果RC_FILE 和RES_FILE变量都没有设置这才可利用。
例如:
RC_ICONS = myapp.ico
2.17 TEMPLATE
模板变量告诉qmake为这个应用程序生成哪种makefile。
可供使用的选项:
选项 | 说明 |
app | 创建一个用于构建应用程序的Makefile(默认) |
lib | 创建一个用于构建库的Makefile |
subdirs | 创建一个用于构建目标子目录的Makefile,子目录使用SUBDIRS变量指定 |
aux | 创建一个不建任何东西的Makefile。如果没有编译器需要被调用来创建目标,比如你的项目使用解释型语言写的,使用此功能。注:此模板类型只能用于Makefile-based生成器。特别是,它不会工作在vcxproj和Xcode生成器。 |
vcapp | 仅适用于Windows。创建一个Visual Studio应用程序项目 |
vclib | 仅适用于Windows。创建一个Visual Studio库项目 |
例如:
TEMPLATE = lib
SOURCES = main.cpp
TARGET = mylib
2.18 TRANSLATIONS
指定包含用户界面翻译文本的翻译(.ts)文件列表。
例如:
TRANSLATIONS += Resource/myapp_zh.ts \
Resource/myapp_en.ts
2.19 UI_DIR
指定来自uic的所有中间文件放置的目录(.ui文件转化成ui_*.h文件的存放目录)。
例如:
unix:UI_DIR = ../myproject/ui
win32:UI_DIR = c:/myproject/ui
2.20 CONFIG
指定编译器选项和项目配置,值由qmake内部识别并具有特殊意义。
以下配置值控制编译标志:
选项 | 说明 |
---|---|
release | 项目以release模式构建。如果也指定了debug,那么最后一个生效。 |
debug | 项目以debug模式构建。 |
debug_and_release | 项目准备以debug和release两种模式构建。 |
debug_and_release_target | 此选项默认设置。如果也指定了debug_and_release,最终的debug和release构建在不同的目录 |
build_all | 如果指定了debug_and_release,默认情况下,该项目会构建为debug和release模式。 |
autogen_precompile_source | 自动生成一个.cpp文件,包含在.pro中指定的预编译头文件 |
ordered | 使用subdirs模板时,此选项指定应该按照目录列表的顺序处理它们。 |
precompile_header | 可以在项目中使用预编译头文件的支持。 |
warn_on | 编译器应该输出尽可能多的警告。如果也指定了warn_off,最后一个生效 |
warn_off | 编译器应该输出尽可能少的警告。 |
exceptions | 启用异常支持。默认设置。 |
exceptions_off | 禁用异常支持。 |
rtti | 启用RTTI支持。默认情况下,使用编译器默认 |
rtti_off | 禁用RTTI支持。默认情况下,使用编译器默认。 |
stl | 启用STL支持。默认情况下,使用编译器默认。 |
stl_off | 禁用STL支持。默认情况下,使用编译器默认 |
thread | 启用线程支持。当CONFIG包括qt时启用,这是缺省设置。 |
c++11 | 启用c++11支持。如果编译器不支持c++11这个选项,没有影响。默认情况下,支持是禁用的 |
c++14 | 启用c++14支持。如果编译器不支持c++14这个选项,没有影响。默认情况下,支持是禁用的 |
qt | 指应用程序使用Qt |
dll | 动态编译库 |
staticlib | 静态编译库 |
plugin | 编译一个插件 |
console | 应用程序需要写控制台 |
2.21 注释
从“#”开始,到这一行结束。快捷键:Ctrl+ /
#LIBS += -LC:\OpenCv4.0\x64\vc14\lib \
# -lopencv_world400d
三、Qt跨平台
在不同的编译平台上编译时,需要设定条件。如:
win32{
SOURCES += 1.cpp
}else{
SOURCES += 2.cpp
}
代码里
#ifdef Q_OS_WIN
const char * const eol = "\r\n";
#else
const char *eol = "\n";
#endif
qt定义的各个系统的宏定义
Q_OS_AIX
Defined on AIX.
Q_OS_ANDROID
Defined on Android.
Q_OS_BSD4
Defined on Any BSD 4.4 system.
Q_OS_BSDI
Defined on BSD/OS.
Q_OS_CYGWIN
Defined on Cygwin.
Q_OS_DARWIN
Defined on Darwin-based operating systems such as macOS, iOS, watchOS, and tvOS.
Q_OS_DGUX
Defined on DG/UX.
Q_OS_DYNIX
Defined on DYNIX/ptx.
Q_OS_FREEBSD
Defined on FreeBSD.
Q_OS_HPUX
Defined on HP-UX.
Q_OS_HURD
Defined on GNU Hurd.
Q_OS_IOS
Defined on iOS.
Q_OS_IRIX
Defined on SGI Irix.
Q_OS_LINUX
Defined on Linux.
Q_OS_LYNX
Defined on LynxOS.
Q_OS_MAC
Deprecated synonym for Q_OS_DARWIN. Do not use.
Q_OS_MACOS
Defined on macOS.
Q_OS_NETBSD
Defined on NetBSD.
Q_OS_OPENBSD
Defined on OpenBSD.
Q_OS_OSF
Defined on HP Tru64 UNIX.
Q_OS_OSX
Deprecated synonym for Q_OS_MACOS. Do not use.
Q_OS_QNX
Defined on QNX Neutrino.
Q_OS_RELIANT
Defined on Reliant UNIX.
Q_OS_SCO
Defined on SCO OpenServer 5.
Q_OS_SOLARIS
Defined on Sun Solaris.
Q_OS_TVOS
Defined on tvOS.
Q_OS_ULTRIX
Defined on DEC Ultrix.
Q_OS_UNIX
Defined on Any UNIX BSD/SYSV system.
Q_OS_UNIXWARE
Defined on UnixWare 7, Open UNIX 8.
Q_OS_WATCHOS
Defined on watchOS.
Q_OS_WIN32
Defined on 32-bit and 64-bit versions of Windows.
Q_OS_WIN64
Defined on 64-bit versions of Windows.
Q_OS_WIN
Defined on all supported versions of Windows. That is, if Q_OS_WIN32, Q_OS_WIN64, or Q_OS_WINRT is defined.
Q_OS_WINPHONE
Defined on Windows Phone 8.
Q_OS_WINRT
Defined for Windows Runtime (Windows Store apps) on Windows 8, Windows RT, and Windows Phone 8.
四 . pro中变量
$$varName$${varName} | qmake工程文件内定义变量的值 |
$$(varName) | qmake运行时,环境变量的值 |
$(varName) | makefile被处理时,环境变量的值 |
$$[varName] | Qt配置选项的值 |
${varName} | 你可能见过这个用法,但本文不讨论这个东西,以后用到时会提及 |
4.1 $$varName
例子:
- test.pro
projectname = dbzhang
FULL1 = $$projectname/800
FULL2 = $${projectname}800
!build_pass:message($$FULL2)
运行qmake时,输出结果是
Project MESSAGE: dbzhang/800 dbzhang800
- 何时加大括号?当变量和后面的字符连接到一块的时候。
- build_pass 干嘛用的?自己试试看吧,如果没有它,同样的消息在windows下会被输出3次(因为会生成3个makefile文件,每个一次)。
4.2 $$(varName)
环境变量,就是大家通常说得环境变量。例子:
- test.pro
message($$(PATH))
运行qmake时,结果:
Project MESSAGE: /usr/bin:/home/debao/qt-labs/qt5/qtbase/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
4.3 $(varName)
makefile被处理时,环境变量的值?如何理解??
看例子:
- test.pro
INCLUDEPATH += $(MYINCLUDEPATH)
执行qmake
$ export MYINCLUDEPATH="/home/dbzhang800/include" $ qmake test.pro
生成的makefile:
... INCPATH = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I$(MYINCLUDEPATH) -I. ...
为了对比,可以将单$符号,改成$$再试试看看,运行命令,结果:
... INCPATH = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/home/dbzhang800/include -I. ...
4.4 $$[varName]
Qt配置选项的值?何解??
- 配置选项值有哪些?
debao@ubuntu:~/ttt/qmake-t1$ qmake -query QT_INSTALL_PREFIX:/usr QT_INSTALL_DATA:/usr/share/qt4 QT_INSTALL_DOCS:/usr/share/qt4/doc QT_INSTALL_HEADERS:/usr/include/qt4 QT_INSTALL_LIBS:/usr/lib QT_INSTALL_BINS:/usr/bin ...
- 有什么用呢?比如,我们编译一个动态库,想将dll放置到Qt的bin目录下(供其它程序使用):
win32:{ DLLDESTDIR = $$[QT_INSTALL_BINS] QMAKE_DISTCLEAN += $$[QT_INSTALL_BINS]\\dbzhang800.dll }
- 除了这些还有其他值么?恩,你可以自己设置一些值,比如
$ qmake -set dbzhang 800
然后就可以在pro文件内用 $$[dbzhang] 了
参考资料
1. Qt中.pro文件介绍
2. Qt之资源系统
6. 浅谈 qmake 之 pro、pri、prf、prl文件