参考 https://www.cnblogs.com/superbi/p/11188145.html 文章以及其它文章,对qggis3.16.6进行了重新编译

一、编译准备

1、Cygwin

1.1安装地址:

下载地址:http://www.cygwin.com/setup-x86_64.exe   64位

http://www.cygwin.com/setup-x86.exe      32位

下载界面如下:

下一步下一步往下安装,其中网络设置为

1.2下载GNU flex, GNU bison

注意事项

(1)View选择Category(若不是,点击View可更改)

(2)Search输入要下载的内容,本工具只用下载flex和bison

(3)选择Devel,展开,如果当前未下载则显示的是"Skip",点击会变成具体的版本,然后点击下一步即可下载(由于我这边都下过了,所以显示的是版本号和keep)。



(4)Search一个库之后,点击"Skip"使其出现版本编号后,清除search框的内容,继续search下一个。全部搜索点击完成后,再点击下一步,所有搜索项将会一起下载。

(5)上述路径不要有中文或空格

下载完成后显示keep标识

2、安装osgeo4W

2.1下载

http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe  64位

http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe     32位

2.2 安装三方库

以前安装先关第三方库非常麻烦,现在osgeo4W提供了方便的安装方法

1、search选择安装qgis-dev-deps(qgis-ltr-deps)

2、操作同Cygwin的步骤类似,略去不提

3、只下载libs中的内容

2.3、cmake

下载地址:

https://github.com/Kitware/CMake/releases/download/v3.13.1/cmake-3.13.1-win64-x64.zip
  64位免安装

https://github.com/Kitware/CMake/releases/download/v3.13.1/cmake-3.13.1-win32-x86.zip  32位免安装

二、生成QGIS工程

1、在D:\OSGeo4W64安装路径下新建一个.bat文件,内容如下:

@echo off

REM VCSDK

set VCSDK=10.0.17763.0

REM qgis解压路径

call
D:\QGIS\qgis-3.16.6\ms-windows\osgeo4w\msvc-env.bat x86_64

REM OSGeo4W64的安装路径

set OSGEO4W_ROOT=D:\QGIS\OSGeo4W64

call "%OSGEO4W_ROOT%\bin\o4w_env.bat"

call
"%OSGEO4W_ROOT%\bin\py3_env.bat"

call
"%OSGEO4W_ROOT%\bin\qt5_env.bat"

set O4W_ROOT=%OSGEO4W_ROOT:\=/%

set LIB_DIR=%O4W_ROOT%

REM VS路径

call
"C:\Program Files (x86)\Microsoft Visual Studio\ 2017\ Community\ VC\ Auxiliary\
Build\ vcvarsall.bat" amd64

path %path%;C:\Program Files (x86)\Microsoft
Visual Studio\ 2017\ Community\ VC\ Tools\ MSVC\ 14.16.27023\bin

REM Cmake路径 cygwin64路径

path %PATH%;C:\Program
Files\CMake\bin;D:\QGIS\cygwin64\bin

@set
GRASS_PREFIX=D:\OSGeo4W64\apps\grass\grass-78

@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include

@set
LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib

REM OSGeo4W64的安装路径

set LIB=%LIB%;%OSGEO4W_ROOT%\apps\Qt5\lib;%OSGEO4W_ROOT%\lib

set
INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\apps\Qt5\include;%OSGEO4W_ROOT%\include

REM call "C:\Program Files
(x86)\Microsoft Visual Studio\ 2017\ Community\ Common7\ IDE\ devenv.exe"

@cmd

这里面的路径根据自己的环境选择。

2、运行创建的.bat文件,输入命令cmake-gui,
打开cmake

3、配置CMAKE

选择目录

点configue进行配置,选择自己安装的VS版本,配置完成后检查这些库的路径是否正确,不正确的手动调整。

可以选择取消python绑定,以及测试工程

4、点击generate生成工程

三、编译以及运行QGIS工程

1、编译QGIS

qgis_core,qgis_gui,qgis_app,qgis_native,qgis_destop,ui,qgis,qgis_analysis,libdxfrw,postgresprovider仅仅保留这几个库就行了,其它的库有需要再加载进来编译就行。

2、运行QGIS

release编译完成,运行QGIS没有问题,运行成功。

3、DEBUG模式

debug模式编译完成qgis后运行发现有错误中断到QCA库的内部,经查找原因应该是需要编译debug版本时,要把依赖的qca,qwt,qtkeychain,QScintilla这几个库单独编译为debug版本。官网提供的库只有release没有debug版本,那怎样编译debug版本的程序呢,其实大家都知道debug编译可以使用release版本的库,只是如果是带UI的库,必须使用debug版本,否则就算编译通过了运行qgis会崩溃。

我自己编译DEBUG版本的方式是,下载与osgeo4W中相同版本的qca,qwt,qtkeychain,QScintilla的库,单独编译,然后再把debug版本的lib和dll拷贝到相关目录之下,在VS2017的相关项目的依赖库中将这几个更改为debug版本即可(应该也可以通过cmake进行配置,本人没做过研究)。

注:Qt自己的Qt5WebKitWidgets这个库也需要修改为debug。

四、其它

1、关于qca

1.1 介绍

QCA是C++ GUI Qt中的一个第三方插件,为Qt提供了一个针对安全性方面编程的框架。从QCA的名称不难发现,它的设计在很多方面借鉴了JCE(Java
Cryptography Extension)——QCA定义了一组公共接口,并由不同的提供者提供加解密算法实现。开发者通过调用简单的API,就可以轻松的实现对称加解密、非对称加解密以及数字证书等功能。QCA是跨平台的,可以运行在Windows、Unix和MacOSX等不同的平台上。

1.2 编译

(1)解压源码

(2)启动qt命令行模式(开始菜单有)

(3)执行cmake-gui

(4)在cmake进行Configure

(5)勾选DEVELOPER_MODE、去除BUILD_TESTS的勾选,在CMAKE_CXX_FLAGS加入 /MP;并添加CMAKE_DEBUG_POSTFIX编译选项(点击CMake界面Add Entry,Name: CMAKE_DEBUG_POSTFIX Type:
STRING Value: d)

(6)Generate、Open Project

(7)打开工程后执行批生成ALL_BUILD (8)在自定义的安装目录中新建qca_2.2.1目录,然后在编译目录中拷贝bin目录,lib目录到qca_2.2.1目录,在源码目录拷贝include到qca_2.2.1目录,用编译目录下的qca_version.h替换include目录中的qca_version.in.h

1.3 注意事项

编译的时候总是出现could
not find pkgconfig,查找原因是因为没有安装pkg-config,下载地址如下:

https://sourceforge.net/projects/pkgconfiglite/files/0.28-1/pkg-config-lite-0.28-1_bin-win32.zip/download

在CMakeLists.txt中增加

set(PKG_CONFIG_EXECUTABLE
"D:/QGIS/pkg-config-lite-0.28-1/bin/pkg-config.exe")

即可通过编译

2、编译qwt

1.1编译

使用qmake进行编译

1打开vs2017命令行

1.2、qt的环境设置

set PATH=%PATH%;D:/QGIS/OSGeo4W64/apps/Qt5/bin;

set QMAKESPEC=win32-msvc

1.3、qmake qwt.pro

1.4、nmake

1.5、nmake install

3、编译QScintilla

QScintilla 是 Scintilla 这个 C++ 编辑器类在 QT 环境下的移植版本。

下载源代码

3.1、打开vs2017命令行

3.2、qt的环境设置

set PATH=%PATH%;D:/QGIS/OSGeo4W64/apps/Qt5/bin;

set QMAKESPEC=win32-msvc

3.3、qmake qscintilla.pro

3.4、nmake all

3.5、nmake install

4、编译qtkeychain

QtKeychain是一个Qt API,用于安全地存储密码和其他秘密数据。数据的存储方式取决于平台。Mac OS X 密码存储在 OS X Keychain中。在 Linux/Unix 上,如果运行,使用 GNOME Keyring,否则QtKeychain 尝试使用 KWallet(通过 D-Bus),如果可用的话。由于 Windows 不提供安全存储服务,QtKeychain通过 Windows API 函数CryptProtectData,使用用户的登录凭据加密密码。然后通过 QSettings 持续加密数据。在不受支持的环境中,QtKeychain报告错误。除非明确要求,否则它不会存储任何未加密的数据(设置不安全回调(真))。‎

(1)解压源码

(2)vs2017命令行

set PATH=%PATH%;D:/QGIS/OSGeo4W64/apps/Qt5/bin; C:/ Program Files/ CMake/ bin

set QMAKESPEC=win32-msvc

(3)执行cmake-gui
(4)在cmake进行Configure、修改CMAKE_INSTALL_PREFIX为自定义的安装目录,并添加CMAKE_DEBUG_POSTFIX编译选项(点击CMake界面Add Entry,Name: CMAKE_DEBUG_POSTFIX Type: STRING Value: d)

(5)然后Generate、Open Project

(6)打开工程后执行批生成ALL_BUILD,INSTALL

5、debug编译错误

5.1编译qgis_core工程时,依赖工程qgis_core_autogen编译时报以下错误。

Fatal Python error : initfsencoding: unable to load the file system codec

ModuleNotFoundError: No module named 'encodings'

解决办法增加 系统变量

变量名 PYTHONHOME,变量值 C:\OSGeo4W\apps\Python37

但是好像我已经取消了python绑定,debug编译的时候还需要python环境?

5.2 不能加载qgsi_app.dll

Could not load qgis_app.dll错误

解决过程:查看qgsi_app的依赖发现缺少Qt5的相关库,把相关库拷贝的编译的目录之下问题解决。

5.3 系统图标不显示

编译完成后qgis启动后,系统的图标不显示。

运行的时候程序找不到正确支持图标格式的库文件,需要将 ”plugins/imageformats”文件拷贝的运行exe目录之下。

platforms这个目录也需要拷贝过来,不要qt界面启动不起来。

qgis3.16.6+vs2017再编译(debug+release)的更多相关文章

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

    题记:大力发展生产力,助力高效采集.(转载请注明出处https://www.cnblogs.com/1024bytes/p/15477374.html) 本篇随笔分为五个部分: 一.获取QGIS3.1 ...

  2. xcode编译 debug版或release 版

    编译debug版本或release 版本 在Run和Stop按钮的右边有一个工程名 点击工程名,选择Manage Schemes 选择Edit... 左侧选择Run ProjectName.app 右 ...

  3. cmake编译Debug和Release

    CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release Rel WithDebInfo 和 MinSizeRel.当这个变量值为 Debug 的时候,C ...

  4. VS2019、Qt5.12及QGis3.16开发常见问题汇总

    在C++.Qt软件开发过程中,常常遇到一些编译错误或警告:本文将VS2019.Qt5.12.10和QGis3.16.10的二次开发过程常见的问题做了整理,供大家参考,也便于日后查阅.该内容分为四部分: ...

  5. QT 4.2.2的安装(安装完还要再编译,注意设置Windows Path)

    (安装篇)前奏: 提到C++的GUI Framework估计大多数人都会想到MFC.VCL,因为在十年前的COM时代,这两个大家伙几乎垄断了整个C++ windows平台上应用程序的开发市场, 但是最 ...

  6. Win7 VS2017 NASM编译FFMPEG(2018.12.22)

    今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境. 简单记录下过程,以防将来重装系统等情况,备忘. https://git ...

  7. Qt5.10.1 在windows下vs2017静态编译

    1.在计算机上安装python库和perl库(因为后续的静态编译需要用到这两种语言),可以在命令行敲击“python”和“perl -v”检查是否安装成功. 2.修改msvc-desktop.conf ...

  8. 编译并使用boost库(win7+boost1.63+vs2015+32位or 64位),超详细,boost于vs2017下编译(64/32bit)

    首先下载得到boost的最新版(目前最新版是1.63) 下载地址: http://www.boost.org   也可以从这里直接下载 http://download.csdn.net/detail/ ...

  9. iOS 设置不同环境下的配置 Debug Release 生产 测试 等等

    其实这个问题大家都知道,但是一般都是清楚一些皮毛的东西,只能进行一些简单的应用.在这里详细说一下模式切换的使用. Xcode给我们自带了两种编译模式Release 和 Debug,通常情况下我们可以利 ...

随机推荐

  1. 口护万亿市场杀出的实力派 Oclean欧可林

    撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 在"青年必去的电影节"上,发现了一个跟他们打成一片的智能护齿"新星". 25日,备受关注的第15届FIRST青年电 ...

  2. es6语法中promise的使用方法

    Promise是一个构造函数,它有resolve,reject,race等静态方法;它的原型(prototype)上有then,catch方法,因此只要作为Promise的实例,都可以共享并调用Pro ...

  3. sqlmap --eval 用法

    今天查资料发现 sqlmap 有一个 --eval 的参数 --eval=EVALCODE Evaluate provided Python code before the request (e.g. ...

  4. 类型定义VS类型别名

    类型定义是在当前包中的一直存在的.输出%T,发现类型前面都有main.前缀 类型别名,其实还是它的根本类型,别名只存在在代码中.编译后就不存在了,还是根本类型.

  5. EXCEL中给包含某个字段的单元格所在行标注颜色

    条件格式->新建规则->使用公式确定要设置格式的单元格 公式: =COUNTIF($A1,"*字符串*") 注意:通配符的使用.

  6. 企业级镜像仓库 harbor

    企业级镜像仓库 harbor 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:跨 Docker 宿主机网络 overlay 类型 h ...

  7. 343 day08File类、递归

    day08[File类.递归] 主要内容 File类 递归 教学目标 [ ] 能够说出File对象的创建方式 [ ] 能够说出File类获取名称的方法名称 [ ] 能够说出File类获取绝对路径的方法 ...

  8. 机器学习——正则化方法Dropout

    1 前言 2012年,Dropout的想法被首次提出,受人类繁衍后代时男女各一半基因进行组合产生下一代的启发,论文<Dropout: A Simple Way to Prevent Neural ...

  9. scrum项目冲刺_day06总结

    摘要:今日完成任务. 1.服务器部署完成 2.由于将数据库放到了服务器上,搜索功能需要修改 总任务: 一.appUI页面(已完成) 二.首页功能: 1.图像识别功能(已完成) 2.语音识别功能(已完成 ...

  10. Java技术开发专题系列之【Guava RateLimiter】针对于限流器的入门到精通(针对于源码分析介绍)

    Guava包中限流实现分析 RateLimiter 之前的文章中已经介绍了常用的限流算法,而google在Java领域中使用Guava包中的限流工具进行服务限流. 回顾使用案例 Google开源工具包 ...