原文链接http://tcspecial.iteye.com/blog/2034537
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
- }