首先我们要去DTK开发者文档参观下,具体参观什么,你需要什么就参观什么
地址:https://docs.deepin.org
编译DTK需要编译以下三个东西:
dtkcore
dtkgui
dtkwidget
三个项目分别为
git clone https://github.com/linuxdeepin/dtkcore.git
git clone https://github.com/linuxdeepin/dtkgui.git
git clone https://github.com/linuxdeepin/dtkwidget.git
dtkcore的静态编译:
我们先去github(大型交友网站)上把dtkcore的源码clone下来
因为deepin在现在的DTK版本中已经做了大量修改,现在的dtkcore已经不支持静态编译了或者说支持静态编译,且只有DTK官方知道,大概是为了融合DTK SDK的原因吧。但是对于开发者来说,我们在某些时候需要DTK静态编译。
第一步:
所以想静态编译DTK我们需要几个文件:
dtk_build.prf
dtk_cmake.prf
dtk_qmake.prf
dtk_module.prf
dtk_translation.prf
dtk_build_config.prf
其中我们把前面5个文件丢在dtkcore/src下面
把最后一个文件放在dtkcore下.
然后打开QT,加载项目pro。这个时候不要加载dtkcore.pro而是加载dtkcore下src目录下的pro。
然后他会让你选择Configure Project,则采用在另外一个文章静态编译的QT。另外一个文章
第二步:
此时我们能看见QT加载项目,同时会出现以下错误:
Cannot find feature dtk_build
Cannot find feature dtk_cmake
Cannot find feature dtk_module
此错误表示找不到这三个东西且无法加载,这三个本来是load的。但是我们没有DTK SDK
所以需要手动指定文件,
在dtkcore/src.pro文件中我们可以看到下面三行
load(dtk_build)
load(dtk_cmake)
load(dtk_module)
我们修改这三行为我们刚才丢进去的src目录下的文件。具体改为如下
include(dtk_build.prf)
include(dtk_cmake.prf)
include(dtk_module.prf)
同时我们需要对版本检测进行忽略
在dtkcore/src.pro文件顶部的CONFIG+=后面增加skip_target_version_ext,完整如下
CONFIG += link_pkgconfig skip_target_version_ext
以上修改完毕后,我们需要修改编译出来的静态库安装在哪里?
于是打开dtk_build_config.prf文件,找到如下代码
X设置:
isEmpty(PREFIX){
PREFIX = /home/jacklee/DTK/libdtk/dtkcore
}
提示错误:
QGSettings/QGSettings:No such file or directory
则打开对应错误提示cpp
然后把#include <QGSettings/QGSettings>改为如下:
#include <QGSettings>
编译完成!
然后采用终端定位到QT构建设置->Build Directory设置的目录下执行安装
make install
这个时候你的dtkcore静态库会出现在你上面X设置中PREFIX目录下了。
dtkgui的静态编译:
第一步:托取dtkgui源码
按照上面编译dtkcore的方法,同样我们需要dtkcore的文件,我们可以直接从dtkcore里面复制到dtkgui/src的目录下
第二步:我们用QT加载dtkgui/src目录下的src.pro
同样在QT的项目设置中设置好构建目录也就是Build Directory
第三步修改dtkgui的src.pro文件
在src.pro文件中的load同样如同编译dtkcore的时候的load改为include
同时也要修改dtk_build_config.prf目录中的PREFIX的地址
第四步:进行编译
编译完成后,同样进入dtkgui的编译目录Build Directory目录下执行
make install
dtkwidget编译:
首先关于修改文件和移动文件我就不再叙述了,按照编译dtkcore和dtkgui的方法来.
在修改dtkwidget项目src.pro文件时候我们可以看到在src.pro下有一行
QT += dtkcore5.5
此时我们把5.5去掉,如下
QT +=dtkcore
同时我们在QT +=dtkcore下增加对版本的忽略。如下
CONFIG += internal_module skip_target_version_ext
将以下代码中的5.5去掉
QT += network concurrent dtkgui5.5 printsupport printsupport-private
完整如下:
QT += network concurrent dtkgui printsupport printsupport-private
错误提示:
QGSettings/QGSettings:No such file or directory
同样删除多余的QGSettings
编译完毕后,进入设定的编译目录,进行make isntall安装
就此 DTK套件的三部曲已经编译完毕
结下来是对DTK套件三个静态库的使用,我们将利用dtkwidget中的examples作为讲解。
QT加载好examples项目下的collections.pro项目文件
我们需要把collections.pro文件中的dtkcore5.5和dtkgui5.5中的版本号去掉。
然后增加
CONFIG +=static
同时删除以下代码:
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../../../src/release -ldtkwidget
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../../../src/debug -ldtkwidgetd
else:unix: LIBS += -L$$OUT_PWD/../../../src -ldtkwidget
INCLUDEPATH += $$PWD/../../../src
INCLUDEPATH += $$PWD/../../../src/widgets
INCLUDEPATH += $$PWD/../../../src/util
DEPENDPATH += $$PWD/../../../src
将上诉代码改为下面:
unix:!macx: LIBS += -L$$PWD/../../../../libdtk/dtkcore/lib/ -ldtkwidget -ldtkgui -ldtkcore -lgsettings-qt -lXext -lX11 -lXi -lxcb-util -lxcb -lstartup-notification-1
INCLUDEPATH += $$PWD/../../../../libdtk/dtkcore/include/libdtk-5.4.0/DWidget
DEPENDPATH += $$PWD/../../../../libdtk/dtkcore/include/libdtk-5.4.0/DWidget
unix:!macx: PRE_TARGETDEPS += $$PWD/../../../../libdtk/dtkcore/lib/libdtkwidget.a
unix:!macx: PRE_TARGETDEPS += $$PWD/../../../../libdtk/dtkcore/lib/libdtkgui.a
unix:!macx: PRE_TARGETDEPS += $$PWD/../../../../libdtk/dtkcore/lib/libdtkcore.a
然后进行对collections.pro项目的编译。注意
编译出来的程序依然对libQTCore5有依赖。主要原因是我们使用了gsettings-qt库。想要不依赖libQTCore5.so,请对gsettings-qt加载静态库
编译完毕后,在编译目录下直接执行collections的demo即可。查看该collections的采用ldd的方法。如下
ldd collections
虽然静态编译体积过大,但是可以省掉因为中间库更新,迭代导致的BUG问题。
有人要问:那编译dtkcore dtkgui dtkwidget的那个prf文件在那里搞。
项目地址如下请自行抄作业:
https://gitee.com/JackLee02/dtk-dtkcore-dtkgui-dtkwidget-static-build
本次教程到此结束,下次我们讲解windows编译DTK套件
enjoy!