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 }