QT pro自动化编译

     QT的pro文件为工程自动化跨平台编译提供了便利,可以直接通过qmake生成Makefile文件,windows执行nmake,linux下执行make即可完成整个项目的编译

1. 项目列表pro

TEMPLAET = subdirs 

# 子项目列表,默认*.pro与工程名一致
SUBDIRS = auth_interface \
				  alm_jna_dll   \
				  auth_service \
				  sdbview \
				  stat_service  \
				  dualswitch
			
# 当*.pro与工程名不一致,通过file属性指定			
data_engine.file = data_engine/data_engine_qt4.pro
auth_interface.file = auth_interface/auth_interface_qt4.pro

2. pro详细配置 

   2.1 配置文件生成目录

   编译过程中会产生moc_*.cpp(moc文件),ui_*.h(ui编译文件),*.obj等中间文件,默认是生成在当前目录,可以通过MOC_DIR,OBJECTS_DIR,UI_HEADERS_DIR,RCC_DIR属性指定

  

   2.2 配置生成后事件

   QMAKE_POST_LINK可以指定生成后事件: QMAKE_POST_LINK += copy debug\\*.exe ..\dist. 当有多个QMAKE_POST_LINK时你会发现拷贝会出错,打开VS10发现,多个拷贝命令没有被分隔开

   解决方案: 在每条命令后加上$$escape_expand(\\n\\t) 即可

   QMAKE_POST_LINK += $$quote(copy /y $$MYDIR\\*.lib $$AIMDIR $$escape_expand(\\n\\t))

   QMAKE_POST_LINK += $$quote(copy /y $$MYDIR\\*.dll $$AIMDIR $$escape_expand(\\n\\t))

   但是这种方式只能被VS10识别,vc6下无法正常工作, 通用解决方案: 多条拷贝命令以&&连接即可

   详见如下pro:

TEMPLATE = lib

INCLUDEPATH +=.
DEPENDPATH += .

HEADERS +=
SORUCES += main.cpp

MYDIR =	..\\dist\\debug		    # 变量MYDIR指定目标文件生成目录
DESTDIR = $$MYDIR		  		# 目标文件目录 
MOC_DIR = $$MYDIR 		  		# moc_*.cpp生成目录 
OBJECTS_DIR = $$MYDIR	  		# *.obj文件生成目录
RCC_DIR = $$MYDIR		  		# 资源文件qrc_*.cpp生成目录 
UI_HEADERS_DIR = $$MYDIR   # UI文件(ui_*.h) 生成目录 
	
win32{
	DEFINES  += WIN32   			# 对于vc6下编译,nmake不会主动包含WIN32系统宏,需要手动定义
        QMAKE_LFLAGS += /stack:0x800000   // 设置堆栈空间大小
	QMAKE_POST_LINK = copy /y $$MYDIR\\*.lib $(QTDIR)\\lib && copy /y $$MYDIR\\*.dll $(QTDIR)\\bin  #拷贝多个文件,以&&连接
}else{	
	#linux平台
	QMAKE_POST_LINK = cp -rf $$MYDIR/*.so* $(QTDIR)/lib
}

   2.3 条件编译

   如何在pro定义很多选项开关,进行选择性编译? qmake提供很多功能强大的内置函数和变量,为动态编译项目提供了便利

   方式一: contains()

   contains 函数用于检测变量是否包括该值 

DEFINES += USE_QT4

#判断DEFINES是否包含USE_QT4宏, 注: contains() 与 { 必须在同一行,否则出错
contains(DEFINES,USE_QT4){
	LIBS += -lmydll_qt4
}else{
	LIBS += -lmydll
}

   方式二: CONFIG 

   CONFIG 变量用于指定工程配置和编译器选项,通常取debug,release,dll等值,也可以自定义选项值; CONFIG变量的每个选项都可以用于条件判断 

CONFIG += qt4

qt4{
LIBS += -lmydll_qt4
}else{
LIBS += -lmydll
}

相关推荐