最近在实现一个自动化编译qt工程的pro生成器,pro文件是组织qt项目的核心。
如果我们开始没有使用pro文件组织项目的话,可以先使用qmake -project生成一份pro文件,然后再着手对其进行修改。下面是我使用命令生成的一个pro文件:
###################################################################### # Automatically generated by qmake (2.01a) ?? 1? 5 19:54:06 2017 ###################################################################### TEMPLATE = app TARGET = DEPENDPATH += . include . src INCLUDEPATH += . # Input HEADERS += include/ISCAS.h include/ISCASDef.h SOURCES += src/ISCAS.cpp
TEMPLATE 参数指的是要编译出来什么东西,是独立运行的app还是dll文件或者是其他,
TEMPLATE = app
A> app -建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
B> lib – 建立一个库的makefile。
C> vcapp – 建立一个应用程序的VisualStudio项目文件。
D> vclib – 建立一个库的VisualStudio项目文件。
E> subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。
TARGET 指定生成的应用程序名,有时候我们将pro文件转换成为vcxproj文件(qmake -r -tp vc),我们想同时指定编译文件名字,比如release版本不带后缀d,而debug版本带d,程序员只需要切换编译模式就可以生成不同名字的文件。
TARGET = ProjectName TARGET = $$qtLibraryTarget($$TARGET)
DEPENDPATH 指定程序编译时依赖的相关路径 DEPENDPATH += . forms include qrc sources
INCLUDEPATH 指的是头文件包含路径 INCLUDEPATH += .
后面的 HEADERS 和 SOURCES 就是指定 编译的头文件和源代码
下面来看另外一个pro文件模板:
PLATFORM_VERSION = x86_32 ALLONE_DIR = E:// QT += xml quick sql xml network script webkit xmlpatterns testlib declarative TEMPLATE = lib TARGET = ISCAS DEPENDPATH += . INCLUDEPATH += ./include $$ALLONE_DIR/include DEFINES += ISCAS_LIB OBJECTS_DIR = ./tmp/obj MOC_DIR = ./tmp/moc DESTDIR = $$ALLONE_DIR/lib/component CONFIG += qt warn_on debug_and_release console # Input HEADERS += ./include/ISCAS.h \ ./include/ISCASDef.h SOURCES += ./src/ISCAS.cpp FORMS += ./forms/CSSC.ui RCC_DIR = forms UI_DIR = ./tmp TRANSLATIONS = CSSC.ts win32{ CONFIG(release,release|debug){ LIBS += $$ALLONE_DIR/lib/win32/ComponentBase.lib LIBS += $$ALLONE_DIR/lib/win32/AllOneFoundation.lib LIBS += $$ALLONE_DIR/lib/win32/EventNotification.lib LIBS += $$ALLONE_DIR/lib/win32/DDSMsgHandle.lib } CONFIG(debug,release|debug) { LIBS += $$ALLONE_DIR/lib/win32/ComponentBased.lib LIBS += $$ALLONE_DIR/lib/win32/AllOneFoundationd.lib LIBS += $$ALLONE_DIR/lib/win32/EventNotificationd.lib LIBS += $$ALLONE_DIR/lib/win32/DDSMsgHandled.lib } }
PLATFORM_VERSION 表示编译的程序版本是32位还是64位。
这个模板里ALLONE_DIR是一个变量,我们可以在下面的位置通过$$ALLONE_DIR使用该变量。
QT 就是Qt的各个lib库。
DEFINES += XX_XX_XXX //定义编译选项,在.h文件中就可以使用 :#ifdef xx_xx_xxx,例如:
#if defined ISCAS_LIB # define ISCAS_EXPORT Q_DECL_EXPORT #else # define ISCAS_EXPORT Q_DECL_IMPORT #endif
Q_DECL_EXPORT宏主要为了导出这个类,生成.dll的同时生成.lib文件。提供给外部接口供其他类使用。
OBJECTS_DIR 为存放中间文件的目录,一般我们在编译我们的工程的时候会生成许多的中间文件,如.o文件(linux下)或.obj(windows下),这样我们的工程就很乱,所以我们可以定义这个选择。
MOC_DIR指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录。
DESTDIR指定生成的应用程序放置的目录。
CONFIG用来指定qmake关于应用程序的配置信息,在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项是更安全的。
A> qt部分告诉qmake这个应用程序是使用Qt来连编的。这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。
B> warn_on部分告诉qmake要把编译器设置为输出警告信息的。
C> debug_and_release 部分告诉qmake应用程序生成debug版和release版的程序。
D> console指定该程序需要写控制台,包括cout cerr 等。
CONFIG(release,release|debug) 指定括号里里的LIBS+=是针对release版的,CONFIG(debug,release|debug)是针对 debug版的。
LIBS: 这里可以选择我们要包含的库,例如我们的工程要用到libz.so的一个压缩库,(如果是在Linux下,则去掉lib和后缀名,windows下去掉后缀名即可)在linux下我可以这样写:
LIBS += -lz windows 下的libz.dll 为 LIBS += -llibz
或是用到image目录下的libimage.so库,那么可以这么写:
LIBS += -L../image/image
RESOURCES 定义工程资源描述文件,工程里需要很多图片,那么这些图片的定义都可以放在backup.qrc文件中进行描述,那么这里就可以指出我们的qrc文件。RESOURCES += backup.qrc
FORMS 指定工程中包含的.ui设计文件
UI_DIR 指定uic命令将.ui文件转化成ui_*.h文件的存放的目录,比如下面是存放到forms目录
UI_DIR += forms
RCC_DIR 指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录
RCC_DIR += ../tmp
TRANSLATIONS = CSSC.ts 就是使用lupdate -verbose CSSC.pro 生成ts文件。然后使用Qt linguist 翻译完毕以后,再使用lrelease -verbose CSSC.pro生成 .qm文件。
参考:
【1】http://blog.csdn.net/fjb2080/article/details/4833666