QGIS编译---QGIS3.22.4 + Qt5.15.3 + VS2019 ---64位版本

news2025/1/17 15:32:06

0 编译结果

先放上编译结果:

图1 QGIS3.22 启动界面
图2 QGIS3.22 操作界面

1 前言

因一些主观、客观原因,一年多没更新博客了,提笔继续。
这是笔者编译的第三个版本QGIS,本次编译原因有四:

(1) 出于个人对QGIS的喜爱,这是最重要的。
(2)新换了一台设备,开发环境改变。
(3) 想了解最新的QGIS特性(截止本博文撰写当日,QGIS已发布3.28版本,3.22是最新的长期稳定版)。

图3 QGIS长期发行版(稳定版)

(4)笔者以前编译的都是32位版本,本次编译64位版本也是为了兑现在上一篇相关博文《QGIS编译—QGIS3.10.6 + Qt5.11.2 + VS2015 —32位版本》中“前言”部分的第3点承诺。

2 特别说明

1. 编译环境&&软件版本:
(1)Windows 10 64位 专业版
(2)Visual Studio Community 2019(社区版)
(3)CMake-3.23.2 64位
(4)Cygwin 64位
(5)OSGeo4W 64位
(6)Qt-5.15.3 64位(通过OSGeo4W 下载)
(7)QGIS-3.22.4 源码
2. 关于QT:
本次编译使用的QT依赖项来源于OSGeo4W下载,读者也可以通过单独下载安装QT-5.15.3,并完成相关配置,得到QT环境。
3. 关于OSGeo4W和Cygwin下载:
(1)安装OSGeo4W和Cygwin的过程相似,都会伴随依赖项的下载安装。
(2)凡是还没下载的依赖项,OSGeo4W和Cygwin中都需要选择install;对于已下载的依赖项,在OSGeo4W和Cygwin中都显示为keep,无需再下载。
(3)OSGeo4W和Cygwin中下载依赖项是增量式的,比如你已经安装了OSGeo4W和Cygwin,但是后期编译过程中发现少了东西(例如iconv、gdal等),可以重复OSGeo4W和Cygwin的安装过程,而已下载的依赖项不会被清除。

3 编译过程

1. 软件准备:
(1)操作系统:Windows 10 64位 专业版(旗舰版、家庭版等其他版本也可)
(2)其他软件下载:

工具包下载地址
QGIS 3.22.4 源码https://github.com/qgis/QGIS/releases/tag/final-3_22_4
CMake 3.23.2(64位)https://cmake.org/files/
Cygwin(64位)https://cygwin.com/install.html
OSGeo4W (64位)https://www.qgis.org/en/site/forusers/download.html
QT 5.15.3(64位)在OSGeo4W 中搜索qgis-dev下载

2. 开始编译:
(1)QGIS源码解压到非中文、无空格路径下;
(2)安装Cygwin的同时下载安装flex、bison,过程如下:

图4 下载Cygwin
图5 Cygwin安装过程
图6 Cygwin安装过程
图7 Cygwin安装过程
图8 Cygwin安装过程
图9 Cygwin安装过程
图10 Cygwin安装过程

(3)安装OSGeo4W 的同时下载安装qgis-dev包,过程如下:

图11 下载OSGeo4W
图12 OSGeo4W安装过程
图13 OSGeo4W安装过程
图14 OSGeo4W安装过程
图15 OSGeo4W安装过程
图16 OSGeo4W安装过程
图17 OSGeo4W安装过程
图18 OSGeo4W安装过程
图19 OSGeo4W安装过程
图20 OSGeo4W安装过程

(4)配置环境变量:
下载完成后,将Cygwin和OSGeo4W及其下载的依赖库添加到系统的环境变量。假设都装在C盘,则在系统变量Path里添加以下内容: C:\cygwin\bin;C:\cygwin\lib;C:\OSGeo4W\bin;C:\OSGeo4W\include;C:\OSGeo4W\lib;
(5)使环境变量生效:
完成上述配置后,启动命令行,输入:echo %path%,回车即可使得配置的环境变量立即生效,而不用注销或重启。
(6)从2个地方修改QGIS源码:
1)源码根路径下,打开“CMakeLists.txt”,找到所有的“CMAKE_CXX_FLAGS”,在后面添加“/MP /utf-8”,如下图所示。其目的有二,一是加快编译速度,二是解决无法识别字符的问题;

图21 修改源码的根路径下的CMakeLists.txt

2)源码根路径下,找到“ms-windows\osgeo4w”,找到“msvc-env.bat”,右键“编辑”打开,修改若干内容,分别如下图所示:

图22 修改msvc-env.bat,其中VCSDK对应Windows版本号
图23 修改msvc-env.bat,本图主要涉及OSGeo4W、Cygwin、CMake的安装位置

3)源码根路径下,找到“src\providers\mdal”,打开“CMakeLists.txt”,找到第19行“find_package(LibXml2)”,在下面添加一行“find_package(Threads)”,如下图所示:

图24 修改msvc-env.bat,“src\providers\mdal\CMakeLists.txt”中增加一行

(7)创建批处理文件:start_compile.bat,右键-编辑,里面内容如下:

@echo off
set VS150COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
 
set INCLUDE=%INCLUDE%;C:\Program Files (x86)\Windows Kits\10\Include
set LIB=%LIB%;C:\Program Files (x86)\Windows Kits\10\Lib
 
set OSGEO4W_ROOT=C:\OSGeo4W
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python39
SET PYTHONPATH=%PYTHONHOME%;%PYTHONHOME%\Scripts
set PYTHON_EXECUTABLE=%PYTHONHOME%/python3.exe
PATH %PYTHONPATH%;%PATH%
 
 
path %OSGEO4W_ROOT%\apps\Qt5\bin;%PATH%
 
set QT_PLUGIN_PATH=%OSGEO4W_ROOT%\apps\Qt5\plugins
set O4W_QT_PREFIX=%OSGEO4W_ROOT:\=/%/apps/Qt5
set O4W_QT_BINARIES=%OSGEO4W_ROOT:\=/%/apps/Qt5/bin
set O4W_QT_PLUGINS=%OSGEO4W_ROOT:\=/%/apps/Qt5/plugins
set O4W_QT_LIBRARIES=%OSGEO4W_ROOT:\=/%/apps/Qt5/lib
set O4W_QT_TRANSLATIONS=%OSGEO4W_ROOT:\=/%/apps/Qt5/translations
set O4W_QT_HEADERS=%OSGEO4W_ROOT:\=/%/apps/Qt5/include
set O4W_QT_DOC=%OSGEO4W_ROOT:\=/%/apps/Qt5/doc
 
set O4W_ROOT=%OSGEO4W_ROOT:\=/%
set LIB_DIR=%O4W_ROOT%
path %path%;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64
path %PATH%;C:\OSGeo4W\apps\Qt5\bin;C:\cygwin64\bin
@set GRASS_PREFIX=C:\OSGeo4W\apps\grass\grass82
@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include
@set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib
set LIB=%LIB%;%OSGEO4W_ROOT%\apps\Qt5\lib;%OSGEO4W_ROOT%\lib
set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\apps\Qt5\include;%OSGEO4W_ROOT%\include
 
call "C:\Users\dbrg\installed\CMake\bin\cmake-gui.exe"

(8)CMake配置与源码构建:
1)以管理员身份启动cmd命令行,切换到上述start_compile.bat路径下,回车运行start_compile.bat,如图所示:

图25 cmd中运行start_compile.bat

2)弹出CMake的图形化界面。

图26 CMake图形化界面

3)“Where is the source code”一栏选择QGIS源码文件夹,“Where to build the binaries”一栏选择生成vs工程的目标路径。
6)点击“Configure”,在弹出对话框选择“Visual Studio 16 2019”,点击“finish”。
7)如果前面的配置没有问题,configure将顺利完成;笔者遇到一个报错,提示没找到gdal,解决方案是手动配置gdal的头文件和lib库路径,如下图所示:

图27 CMake “Configure”报错及解决

同时,取消勾选“WITH_BINDINGS”和“BUILD_TESTING”,其他不变,再次点击“configure”,不再报错。

图28 CMake “Configure”成功

8)点击“Generate”,如果前面的配置没有问题,generate将顺利完成。
9)点击“Open Project”,打开生成的VS工程,可以看到一共有405个工程,如下图所示:

图29 CMake “Open Project”打开VS工程

10)编译模式选择“RelWithDebInfo”,如下图所示:

图30 编译模式选择“RelWithDebInfo”

11)将qgis设置为启动项。

图31 设置qgis为启动项

按照“qgis_core”、“qgis_analysis”、“qgis_app”、“qgis_gui”、“ALL_BUILD”的顺序编译,不出意外的话将顺利完成。
12)将“C:\cygwin64\bin”、“C:\OSGeo4W\bin”和“C:\OSGeo4W\apps\Qt5\bin”路径下所有dll文件,拷贝到“%构建目录%\output\bin\RelWithDebInfo”下,即“qgis.exe”所在目录下。其中,%构建目录%是指CMake的“Where to build the binaries”指向的目录。
13)点击“本地Windows调试器”,QGIS正常启动,证明QGIS源码编译成功。

图1 QGIS3.22 启动界面
图2 QGIS3.22 操作界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

05-微服务调用组件FeignDubbo实战

JAVA 项目中如何实现接口调用 1)Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的UR…

Neo4j图数据库实现节点批量删除

1 前言 1-1 简介 由于对图数据库需要经常维护,图数据库建设初期,需要经常对数据写入删除等操作。 1-2 任务背景 再将1100万数据写入Neo4j后,由于需要对每个实体的label做精细化处理,之前写入的时候每个实体的label全部都为‘Comm…

Webhook端口使用介绍与演示

在API接口调用的集成项目中,用户调用知行之桥的API接口以给EDI系统推送数据时,经常会有这样的疑问:怎样查看是否调用接口成功?怎样查看数据是否推送成功?推送之后用户端会有怎样的响应提示? 为满足以上问题…

个人资料、消息、书签和偏好设置 干货 | 环境问题还是测试的老大难?两个步骤轻松搞定

在实际的工作中,绝大部分公司都至少有3个以上的环境,供测试与研发人员使用。测试人员不可能为每个环境都准备一个自动化测试的脚本,这样的维护成本太过庞大。所以就需要做到一套脚本,可以在各个环境上面运行。首先在上一节提到过的…

并发编程——7.共享模型之工具

目录7.共享模型之工具7.1.线程池7.1.1.自定义线程池7.1.2.ThreadPoolExecutor7.1.2.1.线程池状态7.1.2.2.构造方法7.1.2.3.newFixedThreadPool7.1.2.4.newCachedThreadPool7.1.2.5.newSingleThreadExecutor7.1.2.6.提交任务7.1.2.7.关闭线程池7.1.2.9.异步模式之工作线程7.1.2.…

python之字符串分割

str.split() 是 Python 中字符串类型的一个方法,可以用来将字符串按照指定的分隔符分割成多个子字符串。 例如,如果你有一个字符串 ‘a,b,c,d’,你可以这样分割它: >>> a,b,c,d.split(,) [a, b, c, d]这会将字符串按照…

Web API的方法论及实践

文章目录前言基本原则构建步骤API 实践商品呈现初始的设计个性化,千人千面 & 可视化超前的设计监控遗漏的监控业务服务效率是第一生产力业务服务API样例服务配置ClientInfo“用完即走”的业务服务一个周末的辛劳无数个喝咖啡的悠闲时光总结参考资料前言 对于网…

EMQX+阿里云飞天洛神云网络 NLB:MQTT 消息亿级并发、千万级吞吐性能达成

随着物联网技术的发展与各行业数字化进程的推进,全球物联网设备连接规模与日俱增。一个可靠高效的物联网系统需要具备高并发、大吞吐、低时延的数据处理能力,支撑海量物联网数据的接入与分析,从而进一步挖掘数据价值。 于今年五月发布的 EMQ…

Java后端知识之代码混淆-避免反编译工具获取原码

java, 代码混淆, 编译, 反编译本文是向大家介绍java后端小知识,它能够实现编译后的class代码加密,能够避免使用反编译工具获取源码。本文介绍java代码编译成class后,怎么避免用反编译工具获取源码。编译简单先看一下java源码反编译就是针对编…

MCU-51:单片机蜂鸣器播放孤勇者

目录一、蜂鸣器介绍二、驱动电路2.1 三极管驱动2.2 集成电路驱动三、蜂鸣器播放音乐3.1 键盘与音符对照3.2 音符与频率对照四、孤勇者乐谱五、代码演示前面学习了 MCU-51:单片机蜂鸣器播放音乐和提示音我们知道了可以用51单片机播放乐谱今天我们用51单片机播放 孤勇…

修改NuGet包默认存放位置

默认情况下,NuGet下载的包存放在系统盘(C盘中),这样一来,时间长了下载的包越多,C盘占用的空间也就越多。 1、问题描述 默认情况下,NuGet下载的包存放在系统盘(C盘中,一般在路径C:\Users\用户\.nuget\packag…

让人意外,iPhone15将增加中国制造的比例,苹果再回头

业界人士指出苹果的iPhone15将会分单给中国代工商,屏幕、镜头玻璃等也会增加给中国厂商的比例,这是在业界传闻苹果试图摆脱中国制造之后的好消息,显示出苹果仍然需要中国制造。一、iPhone15加大中国制造比例据悉iPhone15 Pro max将会有部分订…

【20230105】pip pip3 替换国内镜像源

1 存在问题 在使用默认pip3安装库时,出现超时情况。 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host‘files.pythonhosted.org’, port443): Read timed out. 2 国内的pip源 阿里云:https://mirrors.aliyun.com/pypi/sim…

k8s之使用yaml创建pod

写在前面 本文一起看下如何通过声明式的yaml文件来创建pod。 1:命令式和声明式 命令式就是具体告诉计算机做什么,比如我们写的Java代码,Dockerfile定义FROM,COPY,CMD,RUN,Expose等语句&#…

CVE-2017-12615 Tomcat PUT方法任意写文件漏洞复现

今天继续给大家介绍渗透测试相关知识,本文主要内容是CVE-2017-12615 Tomcat PUT方法任意写文件漏洞复现。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次…

ModelForm实践--新建用户

Django组件Form&ModelForm_Neo_21的博客-CSDN博客 Django ModelForm用法详解 前面基本了解ModelForm,使用ModelForm添加用户 一.回顾ModelForm 基于 Model 的定义自动生成表单,这就大大简化了根据 Model 生成表单的过程。 简单的ModelForm class BookMode…

jdk、jmeter安装配置流程以及 双jdk配置和切换(自用)

文章目录一、jdk安装配置1.1 java8配置流程1.2 jdk17配置1.3 jdk没有jre怎么生成1.4 双jdk配置2、Jmeter安装配置电脑重装系统了,重新配下jdk和jmeter。一、jdk安装配置 配jmeter首先得有java。 1.1 java8配置流程 ① java8安装路径 下完直接安装就行 ② 配置环境…

Mysql单表查询30个经典案例

单表查询(30个例子) 单表查询30个例子新建一个数据表gradegrade表中插入数据1、查询1945班的成绩信息2,查询1945班,语文成绩大于60小于90的成绩信息3,查询学生表中1到5行的数据4,显示1945班英语成绩为80&am…

LeetCode题解 17(55,198) 跳跃游戏,打家劫舍<动态规划>

文章目录跳跃游戏(55)代码解答:打家劫舍(198)代码解答:跳跃游戏(55) 这道题是让我们从数组的头部看能不能跳到数组的尾部,每次可跳的最大距离也就是目前所在的索引处的值。 思路: 这…

P3375 【模板】KMP字符串匹配——KMP

【模板】KMP字符串匹配 题目描述 给出两个字符串 s1s_1s1​ 和 s2s_2s2​,若 s1s_1s1​ 的区间 [l,r][l, r][l,r] 子串与 s2s_2s2​ 完全相同,则称 s2s_2s2​ 在 s1s_1s1​ 中出现了,其出现位置为 lll。 现在请你求出 s2s_2s2​ 在 s1s_1s1…