题记:大力发展生产力,助力高效采集。(转载请注明出处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. npm 设置同时从多个包源加载包的方法

    随着前后端分离技术的发展成熟,越来越来越多的后台系统甚至前端系统采用前后端分离方式,在大型前后端分离系统中,前端往往包含大量的第三方js 包的引用,各个第三方包又可能依赖另外一个第三方包,因此急需要一 ...

  2. [第七篇]——Docker Hello World之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Hello World Docker 允许你在容器内运行应用程序, 使用  docker run 命令来在容器内运行一个应用程序. 输出Hello world xxx@xxx:~$ do ...

  3. JAVA语言程序设计课程评价

    紧张的又短暂的一个学期结束了,这个学期也许将成为我人生中一个重要的转折点,作为一名半路出家的选手,在初次了解Java语言时我感到非常的迷茫与不知所措.因为之前很多同学都是通过假期时间在家自学,刚转入新 ...

  4. NOIP初赛:完善程序做题技巧

    最近写的文章好像还很多的.那么今天我们来讨论NOIP初赛的题型--完善程序.完善程序相对是比较难的题目了.全卷100分,完善程序占了大概26分,占比非常大.如果和英语考试试卷做比较,相当于首字母填空( ...

  5. 【Python】python 2.7.16 x64 百度网盘

    倒霉官网下载太慢,下好了分享出来,也给自己留一个备份. 链接:点这里提取码:znaf PS: py2.7版本 for win 64位

  6. 迷你商城后台管理系统---------stage3项目部署测试汇总

    系统测试 在项目部署到云服务器之前,已通过本机启动springboot程序,访问localhost:8080,输入登陆的账户等一系列操作测试:功能测试.健壮性测试,系统已满足用户规定的需求. 系统部署 ...

  7. PHP的zlib压缩工具扩展包学习

    总算到了我们压缩相关扩展的最后一篇文章了,最后我们要学习的也是 Linux 下非常常用的一种压缩格式:.gz 的压缩扩展.作为 PHP 的自带扩展,就像 zip 一样,zlib 扩展是随着 PHP 的 ...

  8. webrtc源码阅读理解一

    webrtc是一个比较成熟的实时音视频处理开源项目,一上来老大就扔给我一本webrtc native实践,虽然狠下心"翻"完了一遍,但是还是云里雾里的,在经过几个月的摸索之后,我大 ...

  9. redis被360禁止,设置启动

    https://blog.csdn.net/blick__winkel/article/details/77986481 一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下 ...

  10. anchor-animation

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...