标签:
杂谈 |
转:http://my.oschina.net/jinzei/blog/100989
**CloudBoard_win32.pro**(subdirs举例)
TEMPLATE = subdirs
SUBDIRS =\
onetengine.depends = raknet omisc
testDebugShow.depends = omisc
#CONFIG += ordered
.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的平台有效
**omisc.pro**(staticlib举例)
QT
TARGET = misc
TEMPLATE = lib
CONFIG += staticlib
#DEFINES
+=
DESTDIR =
$$_PRO_FILE_PWD_/../lib
SOURCES += \
HEADERS += omisc.h \
unix:!symbian {
}
①"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让人不难想到,这是在筛选特定平台.具体的欢迎您测试后补充^_^
**onetengine.pro**(动态库举例)
!include( ../common.pri )
{
}
QT
QT
TARGET = netengine
TEMPLATE = lib
DESTDIR = ../bin
INCLUDEPATH +=
DEPENDPATH += ../omisc ../raknet/source #基于工程目录
win32:LIBS += -lWs2_32
LIBS += -lmisc -lraknet
DEFINES +=
ONETENGINE_LIBRARY
SOURCES += onetengine.cpp \
HEADERS += onetengine.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)
#
#else
#
#endif
#endif // ONETENGINE_GLOBAL_H
提供宏定义ONETENGINE_LIBRARY决定了该工程的作用是导出动态库的.
⑤最后common.pri只是定义了几项公共的没有平台差异的信息