VS2017+QT5.12.10+QGIS3.16环境搭建及开发全流程

2021-10-28

题记:大力发展生产力,助力高效采集。(转载请注明出处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:可以,先唱给你听:

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

应用截图如下:

image