1. 注释
从“#”开始,到这一行结束。
2.模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:
TEMPLATE = app
A> app -建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
B> lib - 建立一个库的makefile。
C> vcapp - 建立一个应用程序的VisualStudio项目文件。
D> vclib - 建立一个库的VisualStudio项目文件。
E> subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。
#指定生成的应用程序放置的目录
DESTDIR += ../bin
#指定生成的应用程序名
TARGET = pksystem
#配置信息
CONFIG用来告诉qmake关于应用程序的配置信息。
CONFIG+= qt warn_on release
在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项是更安全的。
A> qt部分告诉qmake这个应用程序是使用Qt来连编的。这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。
B> warn_on部分告诉qmake要把编译器设置为输出警告信息的。
C> release部分告诉qmake应用程序必须被连编为一个发布的应用程序。在开发过程中,程序员也可以使用debug来替换release
#指定uic命令将.ui文件转化成ui_*.h文件的存放的目录
UI_DIR += forms
#指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录
RCC_DIR += ../tmp
#指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录
MOC_DIR += ../tmp
#指定目标文件(obj)的存放目录
OBJECTS_DIR += ../tmp
#程序编译时依赖的相关路径
DEPENDPATH += . forms include qrc sources
#头文件包含路径
INCLUDEPATH += .
#qmake时产生的信息,【$${a}读取变量a的字符串】,【$$(PATH)读取环境变量PATH】
#message($$(PATH))
#源文件编码方式
CODECFORSRC = GBK
#工程中包含的头文件
HEADERS += include/painter.h
#工程中包含的.ui设计文件
FORMS += forms/painter.ui
#工程中包含的源文件
SOURCES += sources/main.cpp sources/painter.cpp
#工程中包含的资源文件
RESOURCES += qrc/painter.qrc
LIBS += -L folderPath //引入的lib文件的路径 -L:引入路径
Release:LIBS += -L folderPath // release 版引入的lib文件路径
Debug:LIBS += -L folderPath // Debug 版引入的lib 文件路径
DEFINES += XX_XX_XXX //定义编译选项,在.h文件中就可以使用:#ifdefine xx_xx_xxx
RC_FILE = xxx.icns
7. 平台相关性处理
我们在这里需要做的是根据qmake所运行的平台来使用相应的作用域来进行处理。为Windows平台添加的依赖平台的文件的简单的作用域看起来就像这样:
win32 {
SOURCES += hello_win.cpp
}
====================================================================================================================
当你已经创建好你的项目文件,生成Makefile就很容易了,你所要做的就是先到你所生成的项目文件那里然后输入:
Makefile可以像这样由“.pro”文件生成:
qmake -oMakefile hello.pro
对于VisualStudio的用户,qmake也可以生成“.dsp”文件,例如:
qmake -tvcapp -o hello.dsp hello.pro
++++++++++++++++++++++++一个PRO文件实例++++++++++++++++++++++++++++++++++++++++
TEMPLATE = app #模块配置
LANGUAGE = C++ #C++语言
CONFIG += qt warn_on debug release
#引入的lib文件,用于引入动态链接库
LIBS += qaxcontainer.lib
#头文件包含路径
INCLUDEPATH += ..\\..\qtcompnent\qtchklisten\inc ..\\..\qtcompnent\qtclearfile\inc ../../validator\inc\validerrcode ../../qtcompnent/qtdir/inc ../inc ../../utillib/inc/xmlapi ../../utillib/inc/util ../../xercesc ../../qtcompnent/qteditor/inc ../../qtcompnent/qtfunreview/inc ../../qtcompnent/qttable/inc ../../qtcompnent/qtversion/inc ../../qtcompnent/qtini/inc ../../icdtool/icdservices/inc ../../icdtool/dataset/inc ../../icdtool/doi/inc ../../icdtool/reportcontrol/inc ../../icdtool/GSEconctrol/inc ../../icdtool/inputs/inc ../../icdtool/SMVconctrol/inc ../../icdtool/logcontrol/inc ../../scdpreview/inc/scdpreviewtoollib ../../scdpreview/form ../../icdtool/sclcontrol/inc ../../icdtool/log/inc ../../icdtool/settingcontrol/inc ../../qtcompnent\qteditor\inc ../../qtcompnent\qttreeview\inc ../../qtcompnent\qttabwidget\inc ../../communication/inc ../../qtcompnent/qtabout/inc ../iedmanage/inc ../ldmanage/inc ../foriecrun/inc ../../qtcompnent\validset\inc
#工程中包含的头文件
HEADERS += ../inc/exportstable.h \
../inc/maintabwidget.h \
../inc/outputtab.h \
../inc/strutil.h \
../inc/treeeditview.h \
../inc/MainForm.h \
../inc/recenfileini.h \
../inc/ExportCIDFunction.h
#工程中包含的源文件
SOURCES += ../src/main.cpp \
../src/exportstable.cpp \
../src/maintabwidget.cpp \
../src/outputtab.cpp \
../src/treeeditview.cpp \
../src/MainForm.cpp \
../src/recenfileini.cpp \
../src/ExportCIDFunction.cpp
#工程中包含的.ui设计文件
FORMS = ../form/scdmainform.ui \
../form/exportiedform.ui \
../form/Exportsedform.ui \
../form/Importsedform.ui \
../form/formiminputs.ui
#图像文件
#工程中包含的资源文件
RESOURCES = Scintilla.qrc
#CONFIG -= release
CONFIG -= debug
RC_FILE = scdtool.rc
BINLIB = ../../bin ../../xercesc/lib
UI_HEADERS_DIR = ../inc # .ui文件转会为**.h 存放的目录
UI_SOURCES_DIR = ../src # .ui文件转会为**.cpp 存放的目录
QMAKE_LIBDIR = $${BINLIB}
release {
TARGET = scdtool #指定生成的应用程序名
OBJECTS_DIR = ../../obj/scdtool/release #指定目标文件(obj)的存放目录
}
debug {
TARGET = scdtool_d #指定生成的应用程序名
OBJECTS_DIR = ../../obj/scdtool/debug #指定目标文件(obj)的存放目录
}
MOC_DIR = $${OBJECTS_DIR}
DESTDIR = ../../bin #指定生成的应用程序放置的目录
==============================================================================
1.简介:
qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。是qt工具包的一部分.在Unixstdio.h>
int main(int argc, char** argv)
{
printf("Hello, world!\\n");
return 0;
}
创建qmake需要的项目文件(hello.pro),
SOURCES = hello.cpp
CONFIG += qt warn_on release
Makefile可以像这样由".pro"文件生成:
qmake -o Makefile hello.pro
现在你的目录下已经产生了一个 Makefile 文件,输入"make" 指令就可以开始编译 hello.c 成执行文件,执行 ./hello 和 world 打声招呼吧!打开这个Makefile文件看看,是不是很专业啊!
4.高级操作技巧
当然,在实际使用过程中,我们的工程不可能象这个程序这样简单的,它可能有多个目录,多个头文件,多个源文件,需要链接器它不同的链接库等等情况。别急,让我和你慢慢道来。这些都是非常容易用qmake来实现的。我们从一个更加复杂的项目文件为例和你详细的讲诉qmake的高级技巧:
项目文件示例:
SOURCES += myqt.cpp
SOURCES += main.cpp
HEADERS += myqt.h
FORMS += xsimform.ui
TEMPLATE = lib
CONFIG += debug warn_on qt thread x11 plugin
TARGET = ../bin/panel_qt
INCLUDEPATH = ../../../../xsim ../../../../xsim/IMdkit
DEFINES = BDB_VERSION4 OS_LINUX
从这个文件可以知道,SOURCES变量指向项目中的源文件,当项目中有多个源文件时,我们需对项目中的每一个源文件都这样做,直到结束:
SOURCES += hello.cpp
SOURCES += main.cpp
当然,如果你喜欢使用像Make一样风格的语法,你也可以写成这样,一行写一个源文件,并用反斜线结尾,然后再起新的一行:
SOURCES = hello.cpp main.cpp
HEADERS变量指向项目中的头文件,多个头文件的时候,和多个源文件的解决方法一致。
FORMS变量指向项目中使用到的窗体文件(qtdesign设计的.ui文件),qmake也注意了Qt的特殊需求,可以自动的包含moc和uic的连编规则。没有的话或者非qt程序可以不写。
TEMPLATE变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:
app - 建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
lib - 建立一个链接库的makefile。
vcapp - 建立一个应用程序的Visual Studio项目文件。
vclib - 建立一个库的Visual Studio项目文件。
subdirs - 这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的mkefile。
CONFIG变量变量指定了编译器所要使用的选项和所需要被连接的库。配置变量中可以添加任何东西,但只有下面这些选项可以被qmake识别。
下面这些选项控制着使用哪些编译器标志:
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"模板:库是一个共享库(dll)。
staticlib - 只用于"lib"模板:库是一个静态库。
plugin - 只用于"lib"模板:库是一个插件,这将会使dll选项生效。
TARGET变量指定生成的二进制代码的路径和文件名,如果建立的是一个链接库的话,它会在文件名前面自动加上"lib"和在最后自动加上".so".
我们在使用过程中可能会使用到另外的一些函数库,链接库等。函数库的头文件指定使用INCLUDEPATH变量,其它链接库的指定可以通过LIBS 变量来指定,例LIBS += -lmath -L/usr/local/lib
DEFINES变量的指定就如同make的-D选项一样。
结束语
Autoconf 和 Automake 功能十分强大,但对于普通用户来说,太过复杂。qmake方便、简单、快捷,是一个轻量级的makefile生成工具,虽然它是qt工具包的一部分,但它也完全可以用来进行其它程序makefile文件的生成,对于大多数人来说,它已经是非常的够用了。你也可以从qt提供的许多现存的源程序中找到相关的.pro项目文件,它们是学习qmake 更多技巧的最佳范例。
QT工程pro设置实践(with QtCreator)----非弄的像VS一样才顺手?
相信大家很多和我一样,用多了微软给的便利,用人家的就十分不习惯.于是就琢磨原来用到的功能现在要整顺手来,不然可让人怎么活啊! 本篇主要介绍实践使用,并非一篇完整教程,有待读者补充.^_^
我们原本在VS上有一个大工程sln,里面有lib,有dll有exe,甚至还混搭了C#.用起来一点不觉得水土不服.现在要用QT重整,并且需要处处考虑换个平台不要让我改东西.作为探路先锋,先挑了几个基础工程出来做实验:
↑当然,图中是已经成事之后了.想在qtcreator中弄一个工程集还真不是那么方便,我到处找过了,压根没有创建工程集的办法.纵使你可以一个pro一个pro的拖进去,最后也没法保存,下次打开还得重新一个一个pro的拖,没哪个傻蛋总这么干吧..所以首先就是要手动创建一个subdirs型的pro做为工程集,也就是上面看到的
**CloudBoard_win32.pro**(subdirs举例)
TEMPLATE = subdirs
SUBDIRS =\
raknet\
onetengine \
omisc \
testDebugShow
onetengine.depends = raknet omisc
testDebugShow.depends = omisc
#CONFIG += ordered
关于这个pro的详细写法,感觉qt文档写的很细碎,反正我是没看明白.就着广大网友的例子才有了上面一段.TEMPLATE=subdirs这是固定写法,声明是做工程集目录的.SUBDIRS是指明目录中有哪些项,可以嵌套另一个subdirs型的pro. 接下来可以详细定义其中的项目.如.depends表示左边的依赖=后面的项目.
.subdir | 指定子项的目录,不使用子项本身的名字. |
.file | 明确指定该子项使用的pro文件,默认是根据名字自动找的,该项不和.subdir同时使用 |
.condition | Specifies a bld.inf define that must be true for subproject to be built. Available only on Symbian platform. |
.depends | 该子项依赖指定的子项,只在使用makefiles的平台有效 |
.makefile | 该子项的makefile,只在使用makefiles的平台有效 |
.target | 该子项的TARGET,只在使用makefiles的平台有效 |
**omisc.pro**(staticlib举例)
QT -= gui ①
TARGET = misc ②
TEMPLATE = lib #固定写法
CONFIG += staticlib #静态库固定写法
#DEFINES += ③
DESTDIR = $$_PRO_FILE_PWD_/../lib ④
SOURCES += \
ostatic.cpp \
odebugoutput.cpp
HEADERS += omisc.h \
ostatic.h \
ostringmap.hpp \
odebugoutput.h
unix:!symbian { ⑤
maemo5 {
target.path = /opt/usr/lib
} else {
target.path = /usr/lib
}
INSTALLS += target
}
①"QT"是使用的QT库,从平时向导创建工程可以看出,QT默认是包含gui和core,如果你不用,他自动生成的就是
QT-=core gui.此处QT-=gui表示我们还用了core
②TARGET是生成目标,名字不做修饰(不加.a/.lib/.dll)的好处是让qt帮我们加,在不同平台不用我们考虑差别.
同时这里的名字是可以前置路径的,如../lib/misc.它会生成在相对生成目录上一级的lib下.不过我劝你还是不要写相对路径了,因为在windows下会多出debug/release目录,目录深度不同,你换一个平台得重写.这还有更好的办法,后面继续.
③DEFINES是VS里面的预定义头,就是定义宏,哎哟总算见着熟人了~
④DESTDIR就是刚才②说的好办法.它控制最终的输出,相当于VS的OurDir.此处我们控制它输出到$$_PRO_FILE_PWD_/../lib.前面$$开头的是一个pro变量,存放的是工程路径,就是CloudBoard_win32.pro的路径,还有更多的定义参考Qt助手. 你可以用类似message($$_PRO_FILE_)的语句测试变量到底是什么值.具体使用是:写在pro中,右键pro的工程执行qmake.从编译输出中可以看到.
⑤最后这段是自动产生的,本人实在没有仔细研究,看样子应该是一种指定target目录的办法.而unix:!symbian让人不难想到,这是在筛选特定平台.具体的欢迎您测试后补充^_^
raknet相信很多童鞋了解,本案简单将其代码编译成staticlib,DESTDIR=$$_PRO_FILE_PWD_/../lib完工
**onetengine.pro**(动态库举例)
!include( ../common.pri ) { ①
error(" Couldn't find the common.pri file! ")
}
QT -= gui
QT += network xml
TARGET = netengine
TEMPLATE = lib
DESTDIR = ../bin #基于生成目录
INCLUDEPATH += ../omisc ../raknet/source ②
DEPENDPATH += ../omisc ../raknet/source #基于工程目录
win32:LIBS += -lWs2_32 ③
LIBS += -lmisc -lraknet
DEFINES += ONETENGINE_LIBRARY ④
SOURCES += onetengine.cpp \
netengine_export.cpp
HEADERS += onetengine.h\
onetengine_global.h \
../include/macrodefine.h \
../interface/isinkfornetengine.h \
../interface/inetengine.h
**common.pri**(pro包含举例)
INCLUDEPATH += ../interface ../include ⑤
#LIBS += -L$$QTDIR/lib
LIBS += -L../../src/lib
LIBS += -L../lib
①没错,pro中也是可以include的,以当前文件为起点将上一层的common.pri包含进来.common.pri中的相对路径依然以当前pro路径为基础.
②INCLUDEPATH是包含目录,类似于VS中的附加包含目录.至于DEPENDPATH本人实事求是没有研究不明白有什么用.欢迎补充^_^
③使用筛选器,仅在win32下增加Ws2_32.lib的导入. LIBS相当于VS中的附加依赖库,不同的是可以通过-L指定库目录,-l指定库名.其间没有空格的哦.例如上面的LIBS+=-L../lib -lmisc就是可以到../lib中找misc库.misc没有说明.a还是.lib是让qt帮我们做.你也可以指定.lib,然后通过筛选器把其他平台的也写一下.
④提供宏定义ONETENGINE_LIBRARY是因为在向导创建动态库的时候qtcreator帮我们定义了这样的
#ifndef ONETENGINE_GLOBAL_H
#define ONETENGINE_GLOBAL_H
#include #if defined(ONETENGINE_LIBRARY) # define ONETENGINESHARED_EXPORT Q_DECL_EXPORT #else # define ONETENGINESHARED_EXPORT Q_DECL_IMPORT #endif #endif // ONETENGINE_GLOBAL_H 提供宏定义ONETENGINE_LIBRARY决定了该工程的作用是导出动态库的. ⑤最后common.pri只是定义了几项公共的没有平台差异的信息 好了,testDebugShow的工程pro就不多说了,它和动态库的很相似,只有TEMPLATE=app没有XXXX_LIBRARY的宏定义而已. 最后补充一点,为什么总的工程名要叫CloudBoard_win32呢,明眼人一看就知道这是要分平台了呢.没错,一开始我也觉得一个pro就搞定了,里面可以有筛选器,一份pro足以应付.但是实际是qtcreator会为pro产生同名的.user文件,qtcreator的一些配置会写在.user里面,例如最关键的qtSDK位置,编译工具,构建/生成设置等.这些必须根据生成所处的环境区别设置. 所以当你原样跑到Linux下,启动pro就会告诉你配置是别处读来的,是否使用?是:配置一定是错的,否:配置被清洗.这都不是我们希望的.所以唯有分平台建总pro了. 尊重原创,尊重知识产权,从我做起.@2013/01/09 本文感谢众多网贴,不过因为大片雷同,我也不知道原作者究竟是谁. 对一搜一大片全部雷同文章的现状很烦恼,很浪费时间.倡议大家多做总结,分享消化提炼后的有用知识!