分析与学习Qt Solution对qmake的使用

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值