在之前的文章中,我详细介绍了怎么在Windows下编译QGIS源码,也得到了不错的反馈。但是不足的是Windows下只能编译QGIS的Release模式和RelWithDebInfo模式,想要分析源码,“断点调试”肯定是少不了的,但是这两种模式虽然也能做到调试程序,但是总有种种不足,例如,因为代码是优化过的,某些调试操作可能会有所不同或略显困难。另外由于某些变量可能被优化掉,它们在调试过程中可能不可见等等。所以,为了调试程序更方便,决定在Unbuntu下编译一个可以调试的QGIS。
由于上一篇在Windows下编译的是QGIS3.18.3版本,因此本次在Ubuntu上也选择编译该版本。经测试,在Ubuntu 20.04上面编译比较顺利。
主要环境是:
- Ubuntu 20.04
- QT 5.12.8
- Qgis 3.18.3
- CMake 3.16.3
- Flex 2.6.4
- Bison 3.5.1
- Python 3.8.5
除了Ubuntu和QGIS,其他的都不需要刻意单独下载,按照教程来即可。
安装虚拟机
在Ubuntu 20.04镜像下载地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/
使用此镜像新建一个虚拟机,分配的磁盘不要太小,之前分配了20G的磁盘空间,结果根本不够用,于是我后面分配了60G的空间。
安装完毕如下:
配置开发环境
建议将不同版本的QGIS源代码用单独的目录存放,打开命令行终端,输入如下命令,建立工作目录并切换到该目录。
mkdir -p ${HOME}/dev/QGIS_318
cd ${HOME}/dev/QGIS_318
下载源码:
wget https://github.com/qgis/QGIS/archive/final-3_18_3.tar.gz
如果下载速度慢的话,可以关注在下面评论发你一份
下载完毕后解压:
tar -zxf QGIS-final-3_18_3.tar.gz
由于Ubuntu 20.04 默认没有安装g++编译器,因此需要安装一下,执行下面的两条命令
sudo apt-get update
sudo apt-get install build-essential
安装依赖库:
sudo apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpdal-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pdal pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-lxml python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools saga spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb
设置ccache(可选,推荐设置,能加快编译速度):
cd /usr/local/bin
sudo ln -s /usr/bin/ccache gcc
sudo ln -s /usr/bin/ccache g++
编译源码
上面的操作进行完毕之后,有两种编译方式,我将分别进行讲解。
Qt Creator编译(慢)
由于我们已经安装了QT,但是并没有安装Qt Creator,因此先进行安装:
sudo apt-get install qtcreator
安装完毕后,打开Qt Creator:
qtcreator
然后打开项目,选择源码目录下的CMakeLists.txt文件
然后在项目配置页面,点开详情,选择模式,由于我们的目的是调试程序,所以我们只选择Debug模式即可。
点击左侧的“桌面”,在右侧可以配置我们的CMake选项:
然后点击“Configure Project”,生成项目。
默认配置中,QGIS的三维模块和QGIS3.18新增支持的内存数据库SAP HANA模块并没有启用,所以编译完成后得到的QGIS不包含三维地图浏览和SAP HANA数据库存储功能,如果需要使用这两个模块,需将WITH_3D和WITH_HANA设置为“ON”。
然后构建项目即可。
构建的过程要耗费很长时间,可以去看个小视频放松一下~
编译完成后,就可以进行断点调试了。
命令行编译(快)
为了防止和上面的编译方式产生冲突,我们新建个QGIS_318_Command文件夹:
mkdir -p ${HOME}/dev/QGIS_318_Command
cd ${HOME}/dev/QGIS_318_Command
然后进入源码压缩包存放的目录,把源码解压到新建的文件夹中:
tar -zxvf QGIS-final-3_18_3.tar.gz -C ${HOME}/dev/QGIS_318_Command
我们进入到源码目录,新建一个build文件夹,这里是用来存放编译后产生的文件的:
cd ${HOME}/dev/QGIS_318_Command/QGIS-final-3_18_3
mkdir build
cd build
执行CMake:
ccmake ..
按c继续
按e继续
把BUILD的类型改为Debug,其他的选项可以自己根据需要修改。
每次修改完都要再次输入c,进行Configure,如果出现g的按键标志,就可以按g进行Generate。
Generate完成后将自动退出ccmake界面,回到命令行终端。输入“make”命令或者“make -jx”命令,x代表使用的处理器个数,可以加速编译(注意不要超过虚拟机设置的处理器个数和内核个数的乘积),回车,开始编译可执行文件:
又将是漫长的等待,刷会小视频放松一下吧~
成功之后,就可以输入下面的命令进行运行啦!
./output/bin/qgis
成功运行出QGIS。
但是我们的目的是调试QGIS,该如何进行调试呢?
首先,我们需要安装Qt Creator,由于QT环境我们在安装依赖的时候已经安装好了,这里我们只需要安装Qt Creator。输入下面的命令进行安装:
sudo apt-get install qtcreator
安装完毕我们打开Qt Creator:
qtcreator
打开项目,选择源码目录下面的CMakeLists.txt文件打开。
打开后,我们只需要选择build目录下的Debug模式,因为这个我们之前编译好了,不需要再重新编译。
然后点击“Configure Project”,生成项目。
生成项目后,可以正常运行。
调试项目也是正常的。
到此,教程结束。
注意:调试项目需要的处理器开销比较大,请务必给虚拟机多设置几个处理器。