QT工程pro设置实践(with QtCreator)----非弄的像VS同样才顺手?

    相信你们不少和我同样,用多了微软给的便利,用人家的就十分不习惯.因而就琢磨原来用到的功能如今要整顺手来,否则可以让人怎么活啊! 本篇主要介绍实践使用,并不是一篇完整教程,有待读者补充.^_^ windows

    咱们本来在VS上有一个大工程sln,里面有lib,有dll有exe,甚至还混搭了C#.用起来一点不以为水土不服.如今要用QT重整,而且须要到处考虑换个平台不要让我改东西.做为探路先锋,先挑了几个基础工程出来作实验: app

    ↑固然,图中是已经成事以后了.想在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的平台有效


    以上翻译可能有问题.从新总结一下.使用subdirs =a b c d声明的实际上是4个子项的名字.默认你很少作说明的话,qmake根据名字自动去找子目录,启用子目录中的pro文件(名字优先匹配).若是你特别说明a.subdir=./z或者a.file=./z/z.pro就能够不受名字限制. 至于.makefile,应该是你混用第三方库的时候才有必要手动指定使用的makefile. target能够在子pro中指定,除非你以为这里比较统一方便修改.其他的未实践很少说.

**omisc.pro**(staticlib举例) ui

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让人不难想到,这是在筛选特定平台.具体的欢迎您测试后补充^_^ lua

    raknet相信不少童鞋了解,本案简单将其代码编译成staticlib,DESTDIR=$$_PRO_FILE_PWD_/../lib完工 spa

**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包含举例) debug

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帮咱们定义了这样的 unix

#ifndef ONETENGINE_GLOBAL_H
#define ONETENGINE_GLOBAL_H

#include <QtCore/qglobal.h>

#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 本文感谢众多网贴,不过由于大片雷同,我也不知道原做者到底是谁. 对一搜一大片所有雷同文章的现状很烦恼,很浪费时间.倡议你们多作总结,分享消化提炼后的有用知识!

相关文章
相关标签/搜索