admin 管理员组

文章数量: 887021

目录

1.前言

2.下载osgeo4w-setup.exe

2.1.在线安装QGIS必要的库 

 2.2.离线安装QGIS必要的库 

3. Cygwin64安装

4.Qt、VS、CMake、源码下载

5.环境配置 

5.1 执行命令

5.2.CMake配置

6.编译

7.编译错误汇总及解决

7.1 QGIS_CORE模块报错误

7.1.1 节数超过对象文件格式限制: 请使用 /bigobj 进行编译

7.1.2 zip_xx之类函数找不到

7.1.3 使用了未定义的类型QgsSymbol

7.1.4.protobuf编译链接错误

7.1.5 无法打开文件“C:\OSGeo4W\lib\libprotobuf-lite.lib”

7.1.6 无法打开文件“SETUPAPI_LIBRARY-NOTFOUND.lib”

7.1.7 无法打开文件“VERSION_LIBRARY-NOTFOUND.lib”

7.1.8 如下错误:

7.2.qgispython模块报错误

7.3 qgis_app报错

7.4 qgis_gui报错

7.4.1  找不到ui_xxxxx.h文件

8.附录


1.前言

       QGIS作为一款开源的桌面GIS软件,其易用性、稳定性和可扩展性受到越来越多的技术人员和学者的好评与支持,并且基于社区的开发模式使QGIS的研发和迭代非常迅速。目前,QGIS已经具有完整且稳定的桌面GIS功能,并且逐渐地在移动GIS、web GIS等方向进行扩展,可以与众多开源GIS软件和模块相互支持,形成工具链,并构成功能全面的GIS软件体系,在开源GIS中具有独特且完整的应用前景。

        本博文是通过源码来编译、安装QGIS,非源码方式参见: 

                    VS2019+QT5.15.2+QGIS二次开发环境搭建(非源码方式)

说明:QGIS不同版本编译时,大体思路是相同的,但在细节上有些不同,故本篇博文编译的是针对本篇博文提到的编译环境(编译环境见后文描述),其它版本的编译,可能会遇到本篇博文没遇到过的问题,请根据实际情况排除。

2.下载osgeo4w-setup.exe

       打开QGIS官网Welcome to the QGIS project!,在官网的Search中输入osgeo4w,,如下:

图1  

点击红色方框中的链接,如下:

图2

跳转到如下界面:

图3 

 单击红色链接,下载osgeo4w-setup.exe ,等待下载完成。

2.1.在线安装QGIS必要的库 

双击安装osgeo4w-setup.exe,选择:

                                                                            图4

 

 图5

图6

注意:请保证安装OSGeo4W的磁盘空间足够大,否则会影响后续编译。

图7

图8

输入官网的下载地址http://download.osgeo,单击下一步,如果报如下错:

图9

则退出安装向导,重新打开安装向导,再次进入图8界面,输入武汉大学镜像网址:http://gwmodel.whu.edu/mirrors/osgeo4w ,如果没上述错误,则不管,继续下一步。

然后弹出下载选择库界面,如下:

 图10

说明:

  • 请把左侧的全部+号点开,如果是第一次安装,则是skip,单击skip,使变为版本号,表示下载该版本的库。
  • 如果以前安装过,则是keep,单击keep,则可以取消下载或卸载,如果保持keep不变,则在本机安装的库保持不更新、不卸载。
  • 请注意,为了后面的CMake不会因为找不到必要的库而报错,最好全部勾选所有的库。

然后单击下一步,直到下载、安装完成,本步骤时间很长,请耐心等待,并保持网络畅通、电脑不休眠。本人从晚上20:11开始下载到凌晨5点才完成。如下为下载下来的库:

图11

如下为下载完所有的库之后安装这些库到OSGeo4W的安装目录下:

图12

 2.2.离线安装QGIS必要的库 

     2.1节是在线安装QGIS必要的库,但有时用于开发的机器(暂且称为A)由于某种原因不能上网,可以找一台能上网的机器(暂且称为B),按 2.1节步骤,在B中将下载下来的所有库即图11中的库和osgeo4w-setup.exe都拷贝到A上,在A中双击osgeo4w-setup.exe,弹出如下界面:

图13

选择 install from Local Directory, 一直单击“下一步”,直到出现如下界面时:

图14

 单击“Browse...”按钮,找到拷贝过来的库目录(注意:库所在目录必须为最顶层目录,不能为其子目录,如上图中不能为release目录,且目录最好不能含中文),单击下一步,就开始安装所有库到osgeo4w-setup.exe的安装目录下。

3. Cygwin64安装

Cygwin64:用于下载bison,flex软件。如果不装这两个软件,后面步骤的CMake会报错。
Cygwin64下载地址:Cygwin Installation

双击Cygwin ,分别只需下载bison、flex

图15 

图16 

图17 

图18 

图19 

 图20

4.Qt、VS、CMake、源码下载

    Qt、VS下载不再详述,请自行到官网下载。注意:它们的版本不能太低,否则会出现很多诡异问题,本次本人Qt是5.14.1、VS是2019、CMake是3.23.0、QGIS为3.26.2。

各官网地址为:

https://download.qt.io/archive/qt/

https://visualstudio.microsoft/zh-hans/vs/older-downloads/

Download | CMake

源码下载链接为:

https://github/qgis/QGIS

5.环境配置 

5.1 执行命令

     建议将源码文件QGIS移动到C:\OSGeo4W目录下。如若用其他路径,注意CMake默认路径是否出现错误。

 图21

推荐使用x64 Native Tools Command Prompt for VS 2019,分别输入以下12条命令,建议命令一条一条执行输入,及时检查路径是否正确:

set OSGEO4W_ROOT=C:\OSGeo4W
call "%OSGEO4W_ROOT%\bin\o4w_env.bat“
call "%OSGEO4W_ROOT%\etc\ini\python3.bat“
call “%OSGEO4W_ROOT%\etc\ini\qt5.bat”
path %path%;%QtDir%\bin;%OSGEO4W_ROOT%\bin;C:\cygwin64\bin
set O4W_ROOT=%OSGEO4W_ROOT:\=/%
set LIB_DIR=%O4W_ROOT%
set GRASS_PREFIX=%OSGEO4W_ROOT%/apps/grass/grass80
set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include
set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib
set LIB=%LIB%;%OSGEO4W_ROOT%\lib
“C:\Program Files\CMake\bin\cmake-gui.exe“ 

说明:

  • 上面第5行命令最后面的cygwin64的路径是第3节提到的cygwin64的安装目录,请根据实际更改。
  • 上面的python3.bat、qt5.bat可能因为osgeo4w-setup.exe版本不同,名称和目录不同,如:有的名称为python3_env.bat、qt5_env.bat,如果目录下没有指定的这两个bat文件,请在C:\OSGeo4W目录搜索,找到后替换上面的路径即可。
  • 上面第12行启动cmake-gui.exe的路径请根据实际更改,如果路径有空格,请用双引号括起来。

注意:请不要找到cmake-gui.exe或其快捷方式直接双击启动,必须在命令行启动,因为这里设置了环境变量,一旦关闭命令行,则环境变量就无效,导致CMake找不到相关库的路径报错。

5.2.CMake配置

        选择qgis源代码的根目录,编译后的代码建议选择与源代码同级目录下,目录不能包含中文,文件名为build。

 图22

说明:

  • 在CMake图形界面中的“Where is the source code:”的编辑框中输入你的QGIS源码目录,注意:只能在代码的主目录,而不能在子目录,即只能在CMakeLists.txt所在目录,如:C:\OSGeo4W\QGIS-master目录,而不能是C:\OSGeo4W\QGIS-master内的子目录。注 意:目录路径不能有中文,否则CMake会报错。 
  • 在“Where to build the binaries”中输入你想QGIS编译、链接后生成文件的存放目录,一般为QGIS源码目录的同级目录,如:C:\OSGeo4W\build。
  • 选择菜单“Tool->Generate",弹出如下对话框,选择vs的版本和目标平台类型:

  图23

入坑说明:CMake版本不能太低,否则会产生很多诡异问题。本人用CMake 3.23.0版本在本人笔记本能生成VS的解决方案,但在台式机始终报:Could not find Python (missing: PYTHON_LIBRARY)错误,导致死活生成不了VS的解决方案,卸载重装CMake 3.23.0版本问题解决。

6.编译

     在Visual Studio 2019中,将debug模式改为ReWithdebInfo或Debug,左侧代码中找到qgis.core,单击属性页,将平台工具集改成Visual Studio 2019 (v142)并应用。不需要每个工程都编译,只需编译qgis_core、qgis_app、qgis_gui、qgis_analysis、qgispython这几个核心库,外加provider_开头的插件即可,其它库工程等项目需要时再编译,亲测大概需要2个小时左右的时间,生成的所有文件在Build->output->bin->debug目录下,截图如下:

图24

 图25

7.编译错误汇总及解决

7.1 QGIS_CORE模块报错误

7.1.1 节数超过对象文件格式限制: 请使用 /bigobj 进行编译

解决方法如下:

  • 打开该项目的 属性页 对话框
  • 单击 C/C++ 项。
  • 单击 命令行 属性页。
  • 在 其他选项 框中键入编译器选项,添加 /bigobj 即可。

7.1.2 zip_xx之类函数找不到

       这类错误是因为QGIS源码很新,但是zlib库很旧;QGIS源码用到最新版本zlib库中的函数,但下载下来的是旧的zlib库,旧zlib库中没有这些函数。解决方法如下:

从Release libzip 1.9.2 · nih-at/libzip · GitHub

中下载最新的libzip 1.9.2用CMake编译出zip.dll和zip.lib(CMake编译方法同上,下同),然后将编译出来的这两个文件和最新的zlib.h分别放到C:\OSGeo4W\bin、C:\OSGeo4W\lib、C:\OSGeo4W\include 目录下。注意:用CMake编译时,需要用到zip.dll、zip.lib库,否则CMake会失败,可以将C:\OSGeo4W\bin、C:\OSGeo4W\lib旧dll和lib放到C:\Windows\SysWOW64目录下,以便CMake不报错,能生成VS的解决方案。

7.1.3 使用了未定义的类型QgsSymbol

找到qgsmapthemecollection.cpp,在文件顶部加入#include"qgssymbol.h"

7.1.4.protobuf编译链接错误

图26 

     这是后缀名为proto的文件vector_tile.proto通过protoc.exe生成的vector_tile.pb、vector_tile.pb.h文件和libprotobuf相关库不匹配,导致vector_tile.pb的函数在libprotobuf相关库中不存在。本次编译用到的是protobuf 3.13.0,请从protobuf官网下载protobuf 3.13.0,然后用CMake编译出libprotobuf相关库和protoc.exe。protoc 生成C++代码语法如下:

protoc -I=Proto文件路径  –cpp_out=指定输出.h和的目录 Proto文件,也可以使用protoc -h 查看更多帮助。
格式:protoc -I=proto文件存放目录 --cpp_out=生成的cpp文件存放目录 proto文件名

 图27

注意:=号之间不能有空格。关于更多protoc生成C++代码的知识参见 《protoc 生成C++代码》。

7.1.5 无法打开文件“C:\OSGeo4W\lib\libprotobuf-lite.lib”

           这是debug版的链接release版的libprotobuf-lite.lib库了,改为libprotobuf-lited.lib即可或者让debug的libprotobuf-lite生成的库名也叫libprotobuf-lite.lib。

7.1.6 无法打开文件“SETUPAPI_LIBRARY-NOTFOUND.lib”

找到qgis_core工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->链接器->输入->附加依赖  删除该库即可。

7.1.7 无法打开文件“VERSION_LIBRARY-NOTFOUND.lib”

找到qgis_core工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->链接器->输入->附加依赖  删除该库即可。

7.1.8 如下错误:

图28

解决方法: 找到qgis_core工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->链接器->输入->附加依赖 ,然后找到如下lib:

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\SetupAPI.lib
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\Version.lib

 加入即可。注意:10.0.18362.0可能不同,根据自己所在机器更改。

7.2.qgispython模块报错误

: error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(qgispython.obj 中)
3>qgspythonutilsimpl.obj : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”

这些错误产生的原因是:必要的依赖库不匹配造成的。解决方法如下:

在解决方案下,找到qgispython工程,在其上单击鼠标右键,配置属性下拉框中选择相应的版本,如:Debug,然后选择“属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MTd)” 。
建议将所有模块都设置为MTd再编译,否则会因为各种库不兼容(如:有的为Mdd或MT)导致错误。如:protobuf、libdxfrw、Qt5UiToolsd都设置为“多线程 (/MTd)” 。

7.3 qgis_app报错

(1): Qt5UiToolsd.lib(quiloader.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”(mocs_compilation_Debug.obj 中)

这个错误同7.2原理相同。如果你本机装了Qt,用VS2019打开Qt安装目录下的                                                             Qt5.XX.Y\5.XX.Y\Src\qttools\src\src.pro

其中XX.Y为Qt版本号,如:5.14.1。然后选择Qt5UiTools工程,然后在该工程单击右键,选择“属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MTd)” 。将编译生成的Qt5UiToolsd.lib放到C:\OSGeo4W\apps\Qt5\lib\目录下,重新编译qgis_app工程即可。

(2):libdxfrw.lib  : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值     “MDd_DynamicDebug”不匹配值“MTd_StaticDebug”(mocs_compilation_Debug.obj 中)

解决方法:选择libdxfrw工程,然后在该工程单击右键,选择“属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MTd)” 。

注意:qgis_core、qgis_app、qgis_gui、qgis_analysis、qgispython这几个核心库,外加provider_开头的插件、libdxfrw、libprotobuf-lite库,对于release版本,请保持属性->配置属性->C++->代码生成”属性页中的“运行库”下拉框中选择“多线程 (/MT)”,即这几个库必须一致,否则链接不过或即使编译链接能通过,主程序qgis.exe启动时,会各种崩溃。

7.4 qgis_gui报错

7.4.1  找不到ui_xxxxx.h文件

        这是因为后缀名为.ui的界面文件没有生成相应的头文件,将解决方案下的ui工程编译,该工程包含了qgis_gui工程中所有的界面文件,编译后就会生成ui_xxxxx.h文件。

注意:如果编译.ui报“CL.exe“已退出,代码为-1073741515”类似错误,是因为:编译ui文件时,找不到uic.exe,此时请“我的电脑->属性->高级系统设置->环境变量->Path”中加入前文安装的C:\QGIS\OSGeo4W\apps\Qt5\bin,如下:

然后重启Visual Studio后,再编译UI工程。

强烈吐槽一下:上面说明了debug版下编译QGIS 3.26.2的步骤,但现实中不建议用debug开发。因为QGIS官方对引用到的第三方库版本控制不好,如:

  • QGIS源码是最新的,但是通过osgeo4w-setup.exe下载下来的第三方库却不是最新的,导致好多属于第三方库中的函数找不到,导致编译错误。
  • 通过CMake生成的VS解决方案下的工程,debug版本引用了Release版本的库,导致自己开发的程序或编译出的官方的qgis.exe启动会各种诡异的崩溃。
  • QGIS 3.26.0中用到了Qt5WebKit、Qt5WebKitWidgets库,而这两个库都是release版本的,在Qt 5.1.0后,Qt官方不再提供这两个库了。

基于上面的原因,在实际开发时,建议用release版本的库开发,如果要设置断点,网上有很多release版本如何设置断点调试的文章,请自行百度。

QGIS从源码启动会遇到各种问题,具体请参见《QGIS从源码启动遇到的问题汇总》。

8.附录

参考链接:VS2019 QGIS3.24.2源码编译详解_wenwenJingyi的博客-CSDN博客_qgis代码

本文标签: 源码 QGIS