题记:大力发展生产力,助力高效采集。(转载请注明出处https://www.cnblogs.com/1024bytes/p/15477374.html)

本篇随笔分为五个部分:

一、获取QGIS3.16.6源码

二、安装Cygwin、OSGeo4W64并下载QGIS开发所需文件

三、利用CMake工具和QGIS3.16源码生成QGIS工程

四、第三方库qca、qsci、qtchain、qwt的debug编译

五、VS2017+QT5.12.10编译CMake生成的QGIS工程

六、VS、QT、QGIS编译中遇到的问题及解决方案

七、创建一个基于VS2017+Qt5.12.10+QGIS3.16编译环境的GIS应用程序


一、获取QGIS3.16源码
https://github.com/qgis/QGIS/releases

二、安装Cygwin、OSGeo4W64,并下载QGIS开发所需文件

1、Cygwin
1.1 下载地址:http://www.cygwin.com/
1.2 安装:如果代理上网选择Use HTTP/FTP Proxy,填写正确的代理主机和端口;选择一个下载站点。
1.3 下载GNU flex, GNU bison:

(1)View选择Category(若不是,点击View可更改);
(2)Search输入要下载的内容,本工具只用下载flex和bison;
(3)选中Best,选择Devel并展开,如果当前未下载则显示的是"Skip",点击会变成具体的版本,然后点击下一步即可下载(下过的,显示的是版本号和keep);
(4)Search一个库之后,点击"Skip"使其出现版本编号后,清除search框的内容,继续search下一个。全部搜索点击完成后,再点击下一步,所有搜索项将会一起下载;
(5)注意上述路径不要有中文或空格; 下载完成后会显示keep标识。

2、安装OSGeo4W64
2.1 OSGeo4W64安装包下载地址: http://download.osgeo.org/osgeo4w/
2.2 用OSGeo4W64下载QGIS编译需要的依赖(Proj、GEOS、GDAL、Expat、libspatialindex、SpatiaLite、LibZip、Sqlite3、python3、GSL):
(1) Search选择安装qgis-dev-deps(qgis-ltr-deps)可以下全。
(2) 操作同Cygwin的步骤类似

三、第三方库qca、qsci、qtchain、qwt的debug编译

第三方库qca、qsci、qtchain、qwt需要编译Qt5.12.10的debug版,参见下面的两篇博文:

https://www.cnblogs.com/superbi/p/11188145.html

https://www.cnblogs.com/m-zhang-yang/p/14694147.html

四、利用CMake工具和QGIS3.16源码生成QGIS工程

1、下载CMake工具并安装,比如安装在D盘。下载地址:https://cmake.org/download/

2、在OSGeo4W64里创建一个qgis_setup.bat文件,输入以下脚本:

什么脚本?稍后补上。

根据实际情况修改脚本中的参数,保存。

2、Powershell或命令提示符cmd运行qgis_setup.bat,然后输入命令cmake-gui打开Cmake程序

3、配置cmake参数(注意平台类型及VS版本选项)

3.1、选择源码目录(Where is the source code):D:/QGIS/qgis-3.16.6

3.2、选择构建目录(Where to build the binaries):D:/QGIS/build1020

3.3、勾选Grouped、Advanced选项。

3.4、填写QCA、QSCINTILLA、QTKEYCHAIN、QWT的参数。我是把Qt5.12.10版本的这4个第三方库放在D:/QGIS/thirdPartWithinQt5.12.10目录里。

QCA QCA_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include/QtCrypto
QCA QCA_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qca-qt5.lib
QSCINTILLA *QSCINTILLA_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include
QSCINTILLA QSCINTILLA_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qscintilla2_qt5.lib
QTKEYCHAIN QTKEYCHAIN_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include/qt5keychain
QTKEYCHAIN QTKEYCHAIN_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qt5keychain.lib
QWT QWT_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include/qwt6
QWT QWT_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qwt.lib

*QSCINTILLA_INCLUDE_DIR对应的目录到include即可,CMake会自动添加Qsci,也许后续CMake版本对路径的处理会跟其他几项保持一致。

注意:这里的lib用的是release版本的(文件名没有加d),在用VS编译QGIS解决方案时需要注意修改Linker里的这几个lib为debug版(文件名加d);同样也要检查所有Qt的lib为debug版。

3.5、填写其他需要填写的参数:bision、flex等。

3.6、去除WITH_BINDINGS、WITH_QTWEBKIT、WITH_GRASS7的勾。去除ENABLE下的ENABLE_TESTS,如果需要TESTS工程,可以不去除它。

3.7、Configure卡住的时候,结束进程中的python3.exe进程。

4、点击generate生成qgis工程。

Q&A

Q:Could NOT find PkgConfig (missing PKG_CONFIG_EXECUTABLE)
A:Windows下信息提示,可以不管,无害。也可以安装pkg-config(下载地址是https://sourceforge.net/projects/pkgconfiglite/files),填写pkg-config.exe的路径。(You are not supposed to use PkgConfig on Windows.The error is not really an error, it's an informative message. It's completely harmless. Please keep in mind that Ogre has many optional dependencies, you don't need to satisfy all of them. See http://www.freedesktop.org/wiki/Software/pkg-config)。

Q:Cmake Error:Cannot open file for write “/cmakeCache.txt.tmpxxxxx”
A:同一DOS窗口多次执行qgis_setup.bat命令或多次点击camke_gui的配置占用了临时文件,关闭重来即可。

Q:MDAL_LIBRARY NOTFOUND
A:MDAL选项一般不会出现,它位于qgis源码的src/extern里。cmake时候出现报错,关闭重来即可。

Q:WITH选项里哪些可以不选?
A:WITH_BINDINGS(它用于与Python绑定)、WITH_QTWEBKIT(由于QT5.6起弃用了Qt5Webkit,QGIS3没有更换库,如果勾上,尝试用OSGeo4W64/apps/Qt5里带的)、WITH_GRASS7(GRASS_INCLUDE_DIR7可以不填)。另外ENABLE下的ENABLE_TESTS可以不选。

Q:QSCINTILLA_INCLUDE_DIR路径错误
A:这个路径填写到include这一级即可,会自动添加Qsci。qwt、qtkeychain、qca要进一级(cmake3.20.1是这样,也许后续版本会一致)。

Q:编译qgis_core工程时,依赖工程qgis_core_autogen编译时报以下错误:Fatal Python error : initfsencoding: unable to load the file system codec.ModuleNotFoundError: No module named 'encodings'
A:增加系统变量:PYTHONHOME=D:\OSGeo4W\apps\Python37即可。

五、VS2017+QT5.12.10编译CMake生成的QGIS解决方案

这里假定VS2017与QT5.12.10IDE环境已配置好。此时可以打开Cmake生成的build1020里的qgis.sln解决方案,但是我们不需要全部编译,因此新建一个解决方案,不妨叫GisTest.sln。从build1020/src里添加下表中的工程vcxproj(Adding Existing Project):

Existing Project Project Directory ( Default in build1020/src )
libdxfrw app/dwg/libdxfrw
postgresprovider providers/postgres
qgis qgis
qgis_analysis analysis
qgis_analysis_autogen analysis
qgis_app app
qgis_core core
qgis_core_autogen core
qgis_desktop ..
qgis_gui gui
qgis_native native
qgis_process process
ui ui
version ..
ZERO_CHECK ..

将qgis设为启动项(Set As Setup Project);添加的每一个工程,Linker->Input->Additional Dependencies里,都要检查Qt和第三方库的lib,和编译的release/debug一致,debug的lib跟release的lib区别是,debug的lib文件名后多了一个d,如:qwtd.lib、Qt5Guid.lib。

Qgis的运行依赖OSGeo4W64/bin里的动态库,文件夹先过滤“应用程序扩展”,debug版的话再搜索*d.dll,复制这128个debug版的dll到build1020/output/bin/debug中。同理还依赖QT5.12.10 debug版的动态库及第三方debug版的库,一同拷贝进来。

Q&A

Q:Debug模式为什么编译出错,而Release模式可以?
A: Debug模式编译完成qgis后运行发现有错误中断到QCA库的内部,经查找原因应该是需要编译debug版本时,要把依赖的qca,qwt,qtkeychain,QScintilla这几个库单独编译为debug版本。官网提供的库只有release没有debug版本,那怎样编译debug版本的程序呢,其实大家都知道debug编译可以使用release版本的库,只是如果是带UI的库,必须使用debug版本,否则就算编译通过了运行qgis会崩溃。

Q:Could not load qgis_app.dll
A:缺少Qt5的相关库,把相关库拷贝的编译的目录之下问题解决;那4个第三方库也要拷进来。

Q:编译完成后qgis启动不起来、系统图标不显示
A:运行的时候程序找不到正确支持图标格式的库文件,需要将QT的plugins/imageformats和文件拷贝的运行exe目录之下。platforms这个目录也需要拷贝过来,不然界面启动不起来。

Q:Error LNK2019: 无法解析的外部符号 WinMain,MSVCRT.lib
A:由于QGis新建项目是控制台应用程序,而程序通过的是WinMian(及windows入口函数),因此需要作下处理;解决方案见第五章节。

Q:qgis_gui项目中出现未定义的标识符 "QWebElement"
A:Qt5.6起弃用QtWebKit,找不到该模块所致;解决方案见第五章节。

六、VS、QT、QGIS编译中遇到的问题及解决方案

VS、Qt5.12、QGIS3.16问题汇总及处理方法,详见我的另一篇随笔:VS2019、Qt5.12及QGis3.16二次开发常见问题

七、创建一个基于VS2017+Qt5.12.10+QGIS3.16编译环境的GIS应用程序

主要是调用上面Qt5.12.10编译的QGIS3.16的dll、lib和h文件,用VS+QT创建一个GIS应用程序。这里要强调一点,早期的VS2017问题较多,用的Qt VS Tools插件也不够完善,使用最新的VS2017或VS2019体验较好;Qt用5.12.x,和上面的库保持一致。可以用QtCreator创建项目,也可以用VS创建项目。下面归纳下VS2017+Qt5.12.10创建一个基于QGIS3.16的GIS应用程序过程注意的事项。

  • C/C++附加的include目录:

ui文件生成的目录、D:/QGIS/build1020及其src里的几个关键目录(包括子目录)、下载的qgis-3.16.6源码目录src里及上级目录中的external及里面的几个关键目录、D:/QGIS/thirdPartWithinQt5.12.10/include里的几个第三方库目录、Qt5.12.10的几个用到的库目录(如:QtWidgets、QtCore、QtGui、QtNetwork、QtSvg、QtXml、QtPrintSupport等)。

  • Linker输入的附件依赖:

qgis_core.lib、qgis_gui.lib、qgis_analysis.lib、qgis_app.lib、上述Qt5.12.10的debug版的几个lib。

Q&A

Q: Error LNK2019: 无法解析的外部符号 WinMain,MSVCRT.lib是什么缘故?
A: 方法一:见上方的“VS常见问题”;方法二:由于QGis新建项目是控制台应用程序,而程序通过的是WinMian(及windows入口函数),因此需要作下处理:在“qgis_core项目”->“属性”->“连接器”->“输入”附加依赖项中,debug版本添加D:\Qt\Qt5.12.10\msvc2017_64\qtmaind.lib,release版本则添加qtmain.lib。

Q:GisDemo,我能看下你的样子吗?
A:可以,先唱给你听:

我听到传来的谁的声音
像那梦里呜咽中的小河
我看到远去的谁的步伐
遮住告别时哀伤的眼神
不明白的是为何你情愿
让风尘刻画你的样子
……

应用截图如下:

VS2017+QT5.12.10+QGIS3.16环境搭建及开发全流程的更多相关文章

  1. VS2019、Qt5.12及QGis3.16开发常见问题汇总

    在C++.Qt软件开发过程中,常常遇到一些编译错误或警告:本文将VS2019.Qt5.12.10和QGis3.16.10的二次开发过程常见的问题做了整理,供大家参考,也便于日后查阅.该内容分为四部分: ...

  2. 环境篇:CM+CDH6.3.2环境搭建(全网最全)

    环境篇:CM+CDH6.3.2环境搭建(全网最全) 一 环境准备 1.1 三台虚拟机准备 Master( 32g内存 + 100g硬盘 + 4cpu + 每个cpu2核) 2台Slave( 12g内存 ...

  3. React Native的环境搭建以及开发的IDE

    (一)前言 前面的课程我们已经对React Native的环境搭建以及开发的IDE做了相关的讲解,今天我们的主要讲解的是应用设备运行(Running)以及调试方法(Debugging).本节的前提条件 ...

  4. Python环境搭建和开发工具的配置

    本文转自http://237451446.blog.51cto.com/2307663/766781 因为要学习python了,第一步当然是环境搭建和开发工具的配置了,下边开始了. 我的开发环境是在w ...

  5.  paip.android环境搭建与开发事例

    paip.android环境搭建与开发事例 好长时间没有玩AndROID了..以前常常做ANDROID的,今天决定在下载一个要做个时间设置器 作者Attilax ,  EMAIL:1466519819 ...

  6. python环境搭建和开发工具的配置【转】

    因为要学习python了,第一步当然是环境搭建和开发工具的配置了,下边开始了. 我的开发环境是在window下. 一.环境搭建 先在python官网python.org下载安装文件,python2.x ...

  7. 【全网首发】使用vs2017+qt5.12.4编译64位debug和release的qgis3.4.9

    一.摘要: 搜索网络没有发现一篇文章完整的介绍如何编译qgis3.4.x的debug版本,官方的指导也长时间不再更新. 所以前前后后花了4天搞定qgis的debug编译,并成功运行,废话不多说,直接上 ...

  8. VS2017+QT5.12环境配置与动态链接库的生成

    最近需要重新编译一个DLL动态链接库,由于源码中包含了QT代码,所以现在需要配置VS+QT环境. 本人系统环境:Win10 64位 一.安装 Visual Studio 2017软件下载安装教程:ht ...

  9. Ubuntu17.10 React Native 环境搭建

    React Native 环境搭建 环境:ubuntu17.10 安装依赖 必须安装的依赖有:Node.React Native 命令行工具以及 JDK 和 Andriod Studio. 安装nod ...

随机推荐

  1. VUE006. 前端跨域代理服务器ProxyTable概述与配置

    概述 使用  vue-cli  工具生成一个  vue  项目: vue init webpack my-project-vue 在生成的项目结构里,会有一个  index.js  文件.在这个文件里 ...

  2. 本地jvisualvm通过jstatd远程监控GC

    1.查找jdk路径 [root@xxx ~]# which java /data/soft/jdk1.8.0_221/bin/java 2.进入jdk的bin目录下添加指定安全策略文件,注意jdk路径 ...

  3. UVA 11853 Paintball(几何数学+DFS)

    https://vjudge.net/problem/UVA-11853 根据题意描述,相当于在一个正方形中有若干个圆形障碍物,问是否能从左边界走到右边界.判断是否有解需要一点创造性的思维:不妨把正方 ...

  4. 树莓派修改默认pi帐号亲测有效

    # 树莓派修改默认pi帐号亲测有效### 1.我的树莓派机型:3B+,系统:Raspbian桌面标准版,连接的屏幕:电视机..###2.打开树莓派LX终端,快捷键:Ctrl+Alt+t ###3.输入 ...

  5. [闻缺陷则喜]关于boost的想法

    公司有个大约2万行的项目,用到了boost,我想取消掉不用boost.理由:一,可理解性差,除了高手很难弄懂.二,类太多,光头文件就1万多.大点的团队四五个高手,每人用一个boost类.高手流失后,很 ...

  6. 学习PHP中国际化地数字格式处理

    不知道大家有没有了解过,对于数字格式来说,西方国家会以三位为一个进位,使用逗号来分隔.比如,12345678,用标准的格式来表示的话就是 12,345,678 .不过我们中文其实并不会有这样的分隔符, ...

  7. 【PHP数据结构】链表的相关逻辑操作

    链表的操作相对顺序表(数组)来说就复杂了许多.因为 PHP 确实已经为我们解决了很多数组操作上的问题,所以我们可以很方便的操作数组,也就不用为数组定义很多的逻辑操作.比如在 C 中,数组是有长度限制的 ...

  8. C# lambda 实现 Ascii 排序

    var dir = new Dictionary<string, string>();            dir.Add("channelId", "1& ...

  9. windom 下面redis安装和扩展安装

    参考 https://www.cnblogs.com/yulongcode/p/10585229.html https://blog.csdn.net/qq_41921511/article/deta ...

  10. python全局变量的定义

    第一:如定义在类或者函数体外,在函数或者类中引用需要用到 global声明 temp_t = "ceshi" def tmp1(): global temp_t temp_t =1 ...