从2月19日开始打包,到2月23日,QGIS 3.18的安装包经过漫长的4天才完成打包,在这等待的4天里,大家有没有像我一样萌生出自己动手编译源代码的想法呢?今天想分享的是QGIS3.18源代码编译的过程,并在最后整理出编译过程遇到的错误和解决办法。

 01 编译环境

  • 操作系统

本次编译选用Ubuntu 20.04操作系统,理由如下:

从第一个版本开始,QGIS大部分开发是在Linux环境下进行的,与Linux系统的兼容性更好(实际上,我在Windows系统也试着编译过QGIS源码,编译环境的安装、编译过程难度比在Linux系统大得多);

Ubuntu 20.04是一个与Windows系统相类似的、以桌面应用为主的Linux发行版本,对Linux新手来说比较符合操作习惯、易于上手。而且 20.04版本是Ubuntu的长期支持(LTS)版本,社区可提供5年的支持,比最新的20.10版稳定性和成熟度好很多。

  • 其他编译环境

CMake:3.16.3

Flex :2.6.4

Bison:3.5.1

Python:3.8.5

 02 下载源代码

建议将不同版本的QGIS源代码用单独的目录存放,打开命令行终端,输入如下命令,建立工作目录并切换到该目录:

mkdir -p ${HOME}/dev/QGIScd ${HOME}/dev/QGIS

下载源代码:

wget https://github.com/qgis/QGIS/archive/final-3_18_0.tar.gz

解压缩下载回来的代码包:

tar -zxf QGIS-final-3_18_0.tar.gz

 03 安装依赖库

从Ubuntu系统的左下角的开始菜单打开一个命令行终端,参照github的“Building QGIS from source - step by step”文档(https://github.com/qgis/QGIS/blob/master/INSTALL.md),输入如下命令安装QGIS编译需要的依赖库:

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

下载的时间视网络状况而定,有时候会达到几个小时,耐心等待就好。当所有软件包下载完成后,系统汇总需要安装的软件包信息,询问是否继续,输入 “Y”,回车,并等待所有依赖库安装完成。

 04 编译

接下来开始编译过程。依次执行如下命令,创建build目录,执行ccmake:

cd QGIS-final-3_18_0mkdir build-mastercd build-masterccmake ..

ccmake是一个图形化的配置界面,启动后界面如下:

注意:“ccmake ..”命令后一定要加上两个英文状态的点,表示要读取的CMakeLists.txt配置文件所在位置为当前目录的上一级目录。

按键盘“c”键,开始将CMakeLists.txt配置信息读取进来:

完成读入后,配置项和默认取值将显示在窗口中:

用键盘↑、↓箭头在配置项之间移动,如果想修改一个配置项的取值,按“Enter”键,在右边输入要设置的值,再回车确认修改。

我们可以先最简单的编译开始,按默认配置继续走下去。按键盘上的“c”键将配置生成缓存(注意,这里可能需要多次按“c”键)直到下方出现“Press [g] to generate and exit”选项:

按键盘“g”键,生成本地化的makefile:

完成后将自动退出ccmake界面,回到命令行终端。输入“make”命令,回车,开始编译可执行文件:

编译过程需要耗费很长时间,有多种加快编译的方法,例如,“make”命令后可加入处理器个数参数变为“make -j4”,4即处理器个数,多个处理器一起编译将提高速度。

耐心等待进度显示100%,此时我们完成了从源代码编译QGIS软件的整个过程。但是默认设置不包含三维,我们将在下一节详细讨论如何将三维模块加进来。

 05 编译三维模块

默认配置中,三维模块和3.18新增支持的内存数据库SAP HANA模块并没有启用,所以编译完成后得到的QGIS不包含三维浏览和SAP HANA数据库存储功能,如果需要使用这两个模块,在ccmake的配置阶段需将WITH_3D和WITH_HANA设置为“ON”。操作步骤为:

  1. 使用上下箭头将光标移动到WITH_3D项,

  2. 按回车键,将右边的取值从“OFF”切换到“ON”,

  3. 同样的方法可设置WITH_HANA模块。

因为QGIS的三维模块需要Qt53DExtras的支持,加入额外的三维模块将显著增加编译的难度。默认情况下Debian发行版本的Qt模块中不包含Qt53DExtras,所以QGIS源代码仓库根目录下的external/qt3dextra-headers子目录自带了Qt53DExtras相关头文件。

在QGIS源代码编译中启用三维,需要配置5个编译选项把相关文件的路径传递给编译器:WITH_3D、CMAKE_PREFIX_PATH、QT5_3DEXTRA_INCLUDE_DIR、QT5_3DEXTRA_LIBRARY、Qt53DExtras_DIR,各选项的取值如下:

WITH_3D:TRUE;

CMAKE_PREFIX_PATH:{QGIS源代码目录}/external/qt3dextra-headers/cmake;

QT5_3DEXTRA_INCLUDE_DIR:{QGIS源代码目录}/external/qt3dextra-headers/;

QT5_3DEXTRA_LIBRARY:/usr/lib/x86_64-linux-gnu/libQt53DExtras.so;

Qt53DExtras_DIR:{QGIS源代码目录}/external/qt3dextra-headers/cmake/Qt53DExtras。

因为CMakeLists.txt中并没有包含上述所有参数,所以不能使用图形界面ccmake来配置参数,需要借助命令行的cmake命令,以我本次编译为例,运行的cmake命令为:

cmake -DWITH_3D=TRUE -DCMAKE_PREFIX_PATH=/home/wujianling/dev/QGIS-final-3_18_0/QGIS-final-3_18_0/external/qt3dextra-headers/cmake -DQT5_3DEXTRA_INCLUDE_DIR=/home/wujianling/dev/QGIS-final-3_18_0/QGIS-final-3_18_0/external/qt3dextra-headers -DQT5_3DEXTRA_LIBRARY=/usr/lib/x86_64-linux-gnu/libQt53DExtras.so -DQt53DExtras_DIR=/home/wujianling/dev/QGIS-final-3_18_0/QGIS-final-3_18_0/external/qt3dextra-headers/cmake/Qt53DExtras ..

拷贝这个命令时,注意把所有路径参数修改为自己电脑上对应路径,否则将会出现找不到文件的错误。另外,最后的两个英文状态的“..”不能省略!

完成配置后,使用“make”命令重新编译生成QGIS可执行文件。

注意:每次重新编译,都需要使用“rm -f ./*”命令将build-master目录下的所有之前编译生成的缓存清空,否则会遇到意想不到的错误。

 06 运行编译结果

在命令行终端运行“./output/bin/qgis”,将启动刚编译好的QGIS程序,当出现启动界面时,是不是很激动?

点击菜单【View】,如果出现【New 3D Map View】子菜单,点击弹出三维浏览窗口,说明三维模块已编译成功。

 07 出错大全和解决办法

这一节将列出这次编译过程所遇到的所有报错和解决办法,避免大家踩到相同的坑。

  • 安装依赖库可能出现的问题及解决办法

权限不足

按照官网的编译步骤,使用“ apt-get install”命令安装依赖库时,如果当前登陆Ubuntu系统的用户不是root用户,会出现权限不足。

解决办法:在命令前加sudo,并按照提示输入当前用户的密码(注意,不是root用户的密码!)。

依赖库下载失败

这是最常见的问题,是网络连接不稳定导致,解决办法是重新运行前面安装依赖库命令“ apt-get install …”,Ubuntu将会跳过已经下载的软件包,将没有成功下载的包补下回来,然后继续安装过程。

Lighttpd错误

报错信息如下:

Job for lighttpd.service failed because  the control process exited with error code.

see "systemctl status lighttpd.service" and "journalctl -xe" for details.

invoke-rc.d:initscript lighttpd,action "start" failed.

这是lighttpd的一个bug,是由于lighttpd的配置中引用了gamin,而系统没有安装gamin引起。

安装gamin可消除该错误,命令如下:

sudo apt-get install gamin
  • 编译中遇到的问题及解决办法

警告:Policy CMP0075 is not set:Include file check macros honor CMAKE_REQUIRED_LIBRARIES.

这是检查包含文件宏(Include file check macros)在不同cmake版本的执行策略。在cmake 3.12及以上版本,包含文件检查宏使用CMAKE_REQUIRED_LIBRARIES变量,cmake 3.11以下版本则使用CheckIncludeFile模块的check_include_file宏。

该警告在cmake 3.16.3版本可忽略,(但是不能保证将来的cmake版本仍然兼容),所以目前看到这个警告时,直接按“e”键继续即可。

错误:找不到C++编译器

报错信息:No CMAKE_CXX_COMPILER could be found。

这是因为Ubuntu 20.04默认没有安装g++编译器,运行下面命令安装:

sudo apt-get install build-essential

错误:找不到Qt53DExtras相关配置文件

报错信息:

Could not find a package configuration file provided by "Qt53DExtras" with any of the following names:

Qt53DExtrasConfig.cmake

qt53dextras-config.cmake

这是编译三维模块最常见错误,再次检查三维配置的相关选项:CMAKE_PREFIX_PATH、QT5_3DEXTRA_INCLUDE_DIR、QT5_3DEXTRA_LIBRARY、Qt53DExtras_DIR,其中,Qt53DExtras_DIR配置项指向的目录应包含Qt53DExtrasConfig.cmake或者qt53dextras-config.cmake,确保路径正确并且路径下包含这两个文件之一。

错误:找不到Qt5::3DExtras

报错信息:c++ error:Qt5::3DExtras-NOTFOUND: No  such file or directory。

C++编译进度到41%左右,如果出现c++ error:Qt5::3DExtras-NOTFOUND导致编译失败,则需要检查三维相关选项:CMAKE_PREFIX_PATH、QT5_3DEXTRA_INCLUDE_DIR、QT5_3DEXTRA_LIBRARY,使用带上述参数的“cmake”命令重新设置,确保指向的路径正确。

错误:找不到Qt3DExtrax/QCuboidMesh

报错信息:fatal error:Qt3DExtras/QCuboidMesh:No such file or directory。

这是编译进行到43%左右出现的错误,仍然是三维的问题,{QGIS源代码目录}/src/3d/qgsskyboxentity.h文件引用了Qt3DExtras/QCuboidMesh文件,然而/src/3d/目录下并没有Qt3DExtras/QCuboidMesh文件,所以出现错误。

解决办法是,到{QGIS源代码目录}/external/qt3dextra-headers/,将Qt3DExtras目录拷贝到{QGIS源代码目录}/src/3d/目录下。

QGIS 3.18源代码编译就介绍到这里,大家可以按照步骤试着编译,也可以尝试编译其他版本的QGIS源代码,编译过程中遇到的问题欢迎关注公众号并在后台留言一起讨论。


版权声明

本文欢迎转载,转载时请注明出处。

自己动手编译QGIS 3.18源代码,含出错大全和解决办法相关推荐

  1. vs2008 调试时不会命中断点,源代码与原始版本不同,解决办法

    当前不会命中断点,源代码与原始版本不同,解决办法 1.应该是自己一行里写的代码太长了 格式化一下 或者 换下行 2. VC直接把整个文件格式化了一次,断点就可以用了 菜单:编辑-〉高级-〉设置选定内容 ...

  2. 网易云音乐ubuntu 18.04下无法打开的解决办法

    为什么80%的码农都做不了架构师?>>>    网易云音乐ubuntu 18.04下无法打开的解决办法 网易云音乐在ubuntu18.04下无法打开,即显示不了界面,主要是因为环境变 ...

  3. 老是说我编译版本不够_编译etcd出现的cannot load bufio的错误解决办法

    编译etcd出现的cannot load bufio的错误解决办法 今天在安装编译etcd的时候,出现以下错误: go: finding github.com/golang/groupcache v0 ...

  4. Android Studio 编译异常Could not execute build using Gradle installation解决办法

    Android Studio 编译异常Could not execute build using Gradle installation解决办法 参考文章: (1)Android Studio 编译异 ...

  5. Studio 3T 试用期破解(含破解补丁) - 解决办法

    Studio 3T 临时破解教程 使用数据可视化工具Studio 3T查看MongoDB数据集数据,但是Studio 3T试用过期了,没了权限打不开软件怎么办? 这里通过建立批处理文件,重置试用时间, ...

  6. ubuntu 18.04 网络图标不见的解决办法

    ubuntu 18.04 网络图标不见的解决办法 ubuntu 18.04 网络图标不见的解决办法_Stupid_human的博客-CSDN博客 sudo service network-manage ...

  7. 18.VS编译时出现对路径的访问被拒绝解决办法

    最近遇到了这样的错误 编译时提示,某个动态链接库无法访问 原因并不是访问权限的问题,而是该动态链接库正在被其他应用程序使用,如果此时用VS重新编译生成插件的dll,因为dll正在被其他应用程序使用,所 ...

  8. eCos编译Synthethic Target程序时无法解析__sprintf_chk的解决办法

    mingdu.zheng <at> gmail <dot> com http://blog.csdn.net/zoomdy/article/details/10615853 官 ...

  9. 编译Linux版本飞鸽传书的不完全解决办法

     前几天想起在局域网常用的飞鸽传书,想知道在Ubuntu有没有办法运行或者有类似的软件可用,首先想到了Wine,马上Wine一个Windows最新版本的IPMSG,一试就成功了,完美模拟运行. 在 ...

最新文章

  1. matlab把图片转为base64
  2. SVN专题(Visual SVN Server + TortoiseSVN + Visual SVN)
  3. php : Warning: strftime(): It is not safe to rely on the system's timezone settings.
  4. SCCM2012 R2系统部署时,客户端报0x80004005错误(2)
  5. linux sd卡 分区变大,Linux 动态调整分区大小
  6. 域环境安装企业从属CA两种方法
  7. Mysql 中 show full processlist
  8. 直播视频网站源码,静态时钟
  9. 使用win10自带的计算器,计算对数log
  10. 资产类别某一类折旧查询
  11. lpush rpush 区别_redis中lpush、rpush、lset、lrem是什么
  12. python头像转卡通_用python将你的头像“卡通化”
  13. win10 win11 创建共享文件夹 mac 苹果电脑共享 无internet 安全,你的电脑只能访问本地网络中的其它设备 共享文件夹会导致本地电脑无法上网,
  14. 一路编程,一路迷茫,一路醒悟,接着迷茫,再醒悟再迷茫
  15. 展锐UDX710:TTS SDK移植
  16. head和tail命令--用Enki学Linux系列(8)
  17. 如何提高企业员工的企业文化,形成共同的理念价值观
  18. 设为首页,收藏本站代码
  19. RealView MDK中(volatitle unsigned *)(0x40005c00)的理解
  20. 关注视聊效果!中星微摄像头对比测试

热门文章

  1. 2014.10.10 ——Jim Foley第二场讲座User Interface Design——An Overview
  2. 抖音搬运被限流评级怎么办,什么是有效申诉和无效申诉丨国仁网络资讯
  3. 购房指南—买房经验总结
  4. Xtensa DSP结构学习
  5. mysql基本数据类型、笔试题(2018-9-10)
  6. 【第163期】游戏策划做游戏:用UnityBolt实现游泳功能
  7. CF513D Social Circles
  8. unicode汉字内码表(转)
  9. 德鲁克:优秀的管理者,都做到了这3点
  10. ABAQUS均布载荷的悬臂梁静力学计算