题记:大力发展生产力,助力高效采集。(转载请注明出处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. 328 day07线程池、Lambda表达式

    day07[线程池.Lambda表达式] 主要内容 等待与唤醒案例 线程池 Lambda表达式 教学目标 -[ ] 能够理解线程通信概念 -[ ] 能够理解等待唤醒机制 -[ ] 能够描述Java中线 ...

  2. CodeForce-811C Vladik and Memorable Trip(动态规划)

    Vladik and Memorable Trip CodeForces - 811C 有一个长度为 n 的数列,其中第 i 项为 ai. 现在需要你从这个数列中选出一些互不相交的区间,并且保证整个数 ...

  3. dedecms内页调用内容当中第一张图片

    在includes/extend.func.php末尾添加方法: //取第一张图地址 function firstimg($str_pic) { $str_sub=substr($str_pic,0, ...

  4. 使用uView UI+UniApp开发微信小程序--微信授权绑定和一键登录系统

    在前面随笔<使用uView UI+UniApp开发微信小程序>和<使用uView UI+UniApp开发微信小程序--判断用户是否登录并跳转>介绍了微信小程序的常规登录处理和验 ...

  5. 配置 放上传文件的目录 apache(httpd)

    1. 确认服务器 开放8088端口 https://www.apachefriends.org/download.html 下载XAMPP for Windows,安装 2. 修改apache主配置文 ...

  6. shell 脚本获取数组字符串长度

    #!/bin/sh source /etc/init.d/functions funOne() { array=(I am dfh kjlhfjksdf sdfj jdkfhaskl mjjoldfu ...

  7. python序列的修改、散列和切片

    新Vector类 接原vector类定义的新Vector类,原向量类是二维,现定义多维向量类: from array import array import reprlib import math c ...

  8. Python项目生成requirements.txt文件之pipreqs的使用

    生成requirements.txt时使用pip freeze > requirements.txt会将环境下所有的安装包都进行生成,再进行安装的时候会全部安装很多没有的包.耗时耗力其实是不可取 ...

  9. P6295-有标号 DAG 计数【多项式求逆,多项式ln】

    正题 题目链接:https://www.luogu.com.cn/problem/P6295 题目大意 求所有\(n\)个点的弱联通\(DAG\)数量. \(1\leq n\leq 10^5\) 解题 ...

  10. P4233-射命丸文的笔记【NTT,多项式求逆】

    正题 题目链接:https://www.luogu.com.cn/problem/P4233 题目大意 随机选择一条有哈密顿回路的\(n\)个点的竞赛图,求选出图的哈密顿回路的期望个数. 对于每个\( ...