Qt Solution属于第三方库,故本文对写第三方库会有些帮助
目录结构
- 工程文件 project.pro 在最外层,同在最外层的还有 common.pri。
- 源代码在 src 子目录中,文件在由同目录中的 project.pri 进行管理。
- buildlib 目录下的 buildlib.pro 用来管理动态库的生成
- lib 目录用来存放 生成的动态库
- examples 中是若干个例子
- plugin 中的 plugin.pro 用来管理designer插件的生成
- doc 中是由 qdoc3 生成的html和qch文档
典型的目录结构示例:
- buildlib/
- buildlib.pro
- doc/
- examples/
- examples.pro
- ...
- lib/
- plugin/
- plugin.pro
- plugin.h
- plugin.cpp
- src/
- project.pri
- xxx.h
- xxx.cpp
- ...
- project.pro
- common.pri
pro/pri文件
以Qt Solution 中的qtcolorpicker-2.6-opensource为例来看一下:
common.pri
infile(config.pri, SOLUTIONS_LIBRARY, yes): CONFIG += qtcolorpicker-uselib
TEMPLATE += fakelib
QTCOLORPICKER_LIBNAME = $$qtLibraryTarget(QtSolutions_ColorPicker-2.6)
TEMPLATE -= fakelib
QTCOLORPICKER_LIBDIR = $$PWD/lib
unix:qtcolorpicker-uselib:!qtcolorpicker-buildlib:QMAKE_RPATHDIR += $$QTCOLORPICKER_LIBDIR
这是一个全局的文件,主要控制生成还是不生成动态库。
如果我们在同级文件夹内创建一个 config.pri 文件,其包含以下内容:
SOLUTIONS_LIBRARY = yes
那么, CONFIG += qtcolorpicker-uselib将起作用。
后面几行主要是为动态库服务的:
- 动态库的名字
- 动态库的目录
- 如果是unix系统,将此处动态库目录添加到程序运行时的动态库搜索路径中
此处的$$qtLibraryTarget尽管Qt自带的例子中也多处在用,但文档中似乎没有任何说明。
-
它会根据debug和release为动态库生成合适的文件名(比如:QtCore4.dll,QtCored4.dll)
-
使用它之前,需要有TEMPLATE += lib,而此处的 fakelib 仅仅是为了忽悠下qtLibraryTarget,让它能工作。
qtcolorpicker.pro
这个是主工程文件,控制所有的子工程(但plugin为被包含在内,不清楚官方意图是什么)。
TEMPLATE=subdirs
CONFIG += ordered
include(common.pri)
qtcolorpicker-uselib:SUBDIRS=buildlib
SUBDIRS+=examples
因为我们理解了common.pri,现在看这个应该很简单了,如果common.pri中qtcolorpicker-usblib被定义,则使bulidlib子工程生成。如果没定义,当然就是被直接忽略了。
buildlib.pro
TEMPLATE=lib
CONFIG += qt dll qtcolorpicker-buildlib
mac:CONFIG += absolute_library_soname win32|mac:!wince*:!win32-msvc:!macx-xcode:CONFIG += debug_and_release build_all
include(../src/qtcolorpicker.pri)
TARGET = $$QTCOLORPICKER_LIBNAME DESTDIR = $$QTCOLORPICKER_LIBDIR
win32 {
DLLDESTDIR = $$[QT_INSTALL_BINS]
QMAKE_DISTCLEAN += $$[QT_INSTALL_BINS]\\$${QTCOLORPICKER_LIBNAME}.dll
}
target.path = $$DESTDIR INSTALLS += target
该工程用来生成动态库。注意:
- CONFIG 此处添加了 qtcolorpicker-buildlib 选项。我们后面会看到它的用处
- win32下的 DLLDESTDIR 控制将生成的动态库拷贝到哪儿。(可对比前面对 unix 下动态库路径的处理)
该工程包含了源码文件工程:
qtcolorpicker.pri
include(../common.pri)
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
qtcolorpicker-uselib:!qtcolorpicker-buildlib {
LIBS += -L$$QTCOLORPICKER_LIBDIR -l$$QTCOLORPICKER_LIBNAME
} else {
SOURCES += $$PWD/qtcolorpicker.cpp
HEADERS += $$PWD/qtcolorpicker.h
}
win32 {
contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTCOLORPICKER_EXPORT
else:qtcolorpicker-uselib:DEFINES += QT_QTCOLORPICKER_IMPORT
}
如果我们启用了 qtcolorpicker-uselib 且不是在正在创建动态库(也就是我们在使用动态库)时,添加的是链接选项 LIBS。其他情况下(未启用qtcolorpicker-uselib,或者buildlib正在使用该文件生成动态库)则添加的是源文件。
对 win32,配置生成和使用动态库的选项。这两个宏要结合源码中的预处理部分来看。不启用、使用动态库时,这两个宏都不被定义。
前面做了这么多,这么多设置,都是为了用户使用的方便。接下看,我们看看例子中是如何使用这个Solution的。
例子 simple.pro
TEMPLATE = app
INCLUDEPATH += .
include(../../src/qtcolorpicker.pri)
SOURCES += main.cpp
是不是简单太多了?无论是将该solution编译成动态库,还是直接将源码文件加入工程,用户所需要的都只是简单的一个include语句。
转自:http://hi.baidu.com/cyclone/blog/item/54970ad1179279dd572c84d9.html