加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

QT工程pro文件组织多个子工程设置

(2013-02-24 09:17:12)
标签:

杂谈

转:http://my.oschina.net/jinzei/blog/100989

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

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 <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决定了该工程的作用是导出动态库的.

&#9316;最后common.pri只是定义了几项公共的没有平台差异的信息

    好了,testDebugShow的工程pro就不多说了,它和动态库的很相似,只有TEMPLATE=app没有XXXX_LIBRARY的宏定义而已.

    最后补充一点,为什么总的工程名要叫CloudBoard_win32呢,明眼人一看就知道这是要分平台了呢.没错,一开始我也觉得一个pro就搞定了,里面可以有筛选器,一份pro足以应付.但是实际是qtcreator会为pro产生同名的.user文件,qtcreator的一些配置会写在.user里面,例如最关键的qtSDK位置,编译工具,构建/生成设置等.这些必须根据生成所处的环境区别设置. 所以当你原样跑到Linux下,启动pro就会告诉你配置是别处读来的,是否使用?是:配置一定是错的,否:配置被清洗.这都不是我们希望的.所以唯有分平台建总pro了.

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有