https://blog.csdn.net/qq_34357717/article/details/81305084
简介
QGIS是一个免费的、开源的、跨平台(LIN/WIN/Mac)的地理信息系统(GIS),有简单、体积小、硬件要求低等特性,适合用于GIS的开发。作为开源项目,我们可以在GitHub上很轻松的找到QGIS的源码。QGIS和很多开源项目一样,使用CMAKE进行编译,这其中就会涉及到一些困难的地方。
注意
无论是这篇博客或是其他地方的博客,随着时间的推移和QGIS源码的更新,难免会和官方产生脱节,例如依赖库的版本不一样,这时如果像笔者一样照着旧版本的博客做,很可能在编译中出现各种麻烦的问题,因此,建议一切以官方教程为准。笔者下文所提及的内容,都是以2018年7月20日的文档内容作为参考的。
官方教程很重要
在GitHub上可以找到QGIS项目的主页(https://github.com/qgis)
首先需要将整个项目下载下来
然后利用notepad++等软件,打开根目录中的INSTALL文件,当然直接在浏览器中打开也是可以的。
英文好的同学直接对着这个文档基本上可以完成编译了, 当然笔者也还是把自己的经验总结在了下面。
环境配置过程
下载所需内容
QGIS可以在linux上编译,但基于使用习惯,笔者使用window10平台进行编译。首先,IDE我们肯定是选用微软的visual Studio,和教程中使用VS2015稍有不同的是,笔者在这里使用的是VS2017。当然,还是要用到VC++2015的库,这个一般情况下是不带了,需要修改VS的功能,添加相应的工具集。
然后需要从连接中下载以下软件包(笔者统一使用的是64位的版本):
| Tool | | | Website | |
| CMake | | https://cmake.org/files/v3.7/cmake-3.7.2-win64-x64.msi |
| cygwin | | http://cygwin.com/setup-x86.exe (32bit) or http://cygwin.com/setup-x86_64.exe (64bit) |
| OSGeo4W | | http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe (32bit) or http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe (64bit) | |
| ninja | | https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip |
对于cygwin和OSGeo4W,下载完后都是选择高级安装。
从网络下载
当然路径避免出现中文或符号,如非安装在默认路径,建议新建一个文件夹把这些包整理到一起,方便查找需要的内容。
文件下载路径不怎么关键,只是暂时存放而已,默认就行
连接方法,有代理用代理,没有直接选直连也没什么问题,当然下载速度可能受到影响。
下载站点也是随便选,如果速度实在太慢的话也可以尝试换一个。
在选包界面的搜索栏输入文档中给出的包名,目前官方文档给出的是:
cygwin:
- bison
- flex
- git(其实git到不是这么必要,当然下载多一个也没什么问题)
OSGeo4W:
- qgis-rel-deps
另外之后编译的过程中如果发现有缺失的包也是可以重新在这里补充下载的。
直接下一步完成安装即可。
安装完cygwin和OSGeo4W后,讲ninja.exe复制到之前安装OSGeo4W目录的OSGeo4W64in下。、
编译源码
找到OSGeo4W的安装路径,在下面新建一个文本文档,输入并修改红色字体部分为你的源码路径。
@echo off
call X:srcqgisms-windowsosgeo4wmsvc-env.bat x86_64
@cmd
-
@echo off
-
call X:srcqgisms-windowsosgeo4wmsvc-env.bat x86_64
-
@cmd
(【X:srcqgis】即从GitHub上下载的源码包解压后的位置,实在找不到也可以试试搜索msvc-env.bat这个文件然后根据其路径修改)
将这个文本文档的文件名修改为【OSGeo4W-dev.bat】保存在OSGeo4W的安装目录下,然后运行它。
这是官方文档给出的方法,但是如果直接照做,之前的安装路径又有所修改的话,很可能会报错,例如找不到文件,其实这是因为环境变量没有修改的原因,其实官方文档的方法就是直接调用了msvc-dev.bat这个批处理文件而已,根据这个提示右键编辑查看msvc-dev.bat这个文件。
-
@echo off
-
REM ***************************************************************************
-
REM msvc-env.cmd
-
REM ---------------------
-
REM begin : June 2018
-
REM copyright : (C) 2018 by Juergen E. Fischer
-
REM email : jef at norbit dot de
-
REM ***************************************************************************
-
REM * *
-
REM * This program is free software; you can redistribute it and/or modify *
-
REM * it under the terms of the GNU General Public License as published by *
-
REM * the Free Software Foundation; either version 2 of the License, or *
-
REM * (at your option) any later version. *
-
REM * *
-
REM ***************************************************************************
-
-
set ARCH=%1
-
if not "%ARCH%"=="x86" if not "%ARCH%"=="x86_64" (
-
goto usage
-
)
-
-
if "%OSGEO4W_ROOT%"=="" (
-
if "%ARCH%"=="x86" (
-
set OSGEO4W_ROOT=C:OSGeo4W
-
set VCARCH=x86
-
) else (
-
set OSGEO4W_ROOT=C:OSGeo4W64
-
set VCARCH=amd64
-
)
-
)
-
-
if not exist "%OSGEO4W_ROOT%ino4w_env.bat" (echo o4w_env.bat not found & goto error)
-
call "%OSGEO4W_ROOT%ino4w_env.bat"
-
call "%OSGEO4W_ROOT%inpy3_env.bat"
-
call "%OSGEO4W_ROOT%inqt5_env.bat"
-
-
if not "%PROGRAMFILES(X86)%"=="" set PF86=%PROGRAMFILES(X86)%
-
if "%PF86%"=="" set PF86=%PROGRAMFILES%
-
if "%PF86%"=="" (echo PROGRAMFILES not set & goto error)
-
-
set VS140COMNTOOLS=%PF86%Microsoft Visual Studio 14.0Common7Tools
-
call "%PF86%Microsoft Visual Studio 14.0VCvcvarsall.bat" %VCARCH%
-
path %path%;%PF86%Microsoft Visual Studio 14.0VCin
-
-
set GRASS7=
-
if exist %OSGEO4W_ROOT%ingrass72.bat set GRASS7=%OSGEO4W_ROOT%ingrass72.bat
-
if exist %OSGEO4W_ROOT%ingrass74.bat set GRASS7=%OSGEO4W_ROOT%ingrass74.bat
-
if "%GRASS7%"=="" (echo GRASS7 not found & goto error)
-
for /f "usebackq tokens=1" %%a in (`%GRASS7% --config path`) do set GRASS_PREFIX=%%a
-
-
set PYTHONPATH=
-
if exist "%PROGRAMFILES%CMakein" path %PATH%;%PROGRAMFILES%CMakein
-
if exist "%PF86%CMakein" path %PATH%;%PF86%CMakein
-
if exist c:cygwin64in path %PATH%;c:cygwin64in
-
if exist c:cygwinin path %PATH%;c:cygwinin
-
path
-
-
set LIB=%LIB%;%OSGEO4W_ROOT%appsQt5lib;%OSGEO4W_ROOT%lib
-
set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%appsQt5include;%OSGEO4W_ROOT%include
-
-
goto end
-
-
:usage
-
echo usage: %0 arch
-
echo sample: %0 x86_64
-
exit /b 1
-
-
:error
-
echo ENV ERROR %ERRORLEVEL%: %DATE% %TIME%
-
exit /b 1
-
-
:end
不难发现,其中涉及到的重要的环境变量主要有:
OSGEO4W_ROOT(OSGeo4W的根目录)
PF86(软件默认安装目录)
VS140COMNTOOLS(调用VS的vcvarsall.bat批处理文件)
GRASS7(这个的路径中是【/】而不是【】,要注意)
PYTHONPATH(SIP包所在路径)
LIB(OSGeo4W依赖库头文件)
INCLUDE(OSGeo4W静态库文件)
如果之前更改了路径,修改相应的环境变量即可。
其中,VS140COMNTOOLS是VS2015的变量名,如果是像笔者一样使用VS2017的话,还需要将变量名VS140COMNTOOLS改为VS150COMNTOOLS。
修改方法:
1、利用批处理文件修改
创建一个文本文件,命名path.bat,内容参考如下,路径换成相应安装路径即可,找不到可以搜索一下
-
@echo off
-
set VS150COMNTOOLS = C:Program Files (x86)Microsoft Visual Studio2017CommunityVCAuxiliaryBuildvcvarsall.bat" x64
-
-
set OSGEO4W_ROOT=E:QGISdevelopOSGeo4W64
-
call "%OSGEO4W_ROOT%ino4w_env.bat"
-
path %PATH%;E:QGISdevelopCMAKEin;E:QGISdevelopcygwinin;E:QGISdevelopOSGeo4W64appsPython36
-
-
@set GRASS_PREFIX=E:/QGISdevelop/OSGeo4W64/apps/grass/grass-7.4.1
-
@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%include
-
@set LIB=%LIB%;%OSGEO4W_ROOT%lib;%OSGEO4W_ROOT%lib
-
-
@cmd
在CMD中运行这个BAT
2、右键此电脑→属性→高级系统设置→高级→环境变量。
一个一个变量添加或者更改。
3、备份msvc-dev.bat后直接修改里面的相关路径,然后再次运行msvc-dev.bat
通过以上3种方法设置完环境变量之后,官方的教程会讲用git下载源码,如果之前下载过就可以忽略这一步了
接下来是具体的编译了,官方提供了两种方法,使用Trugonly.cmd创建MSVC解决方案文件或者使用cmake-gui
由于各种路径设置的原因,笔者建议还是使用传统的cmake进行编译
打开之前创建的OSGeo4W-dev.bat
打开cmake-gui,设置好源码路径和要输出的路径,然后点击Configure
另外在CMAKE卡中设置项目要安装的路径,推荐设置在一个新的空目录中,避免导致混乱
出现错误也是正常的,关键还是路径的问题,所以说前面环境变量的设置十分重要。另外在WITH中去掉一些不必要的组件,最最最重要的是DESKTOP,然后就是GUI等一些组件,当然直接使用默认的也基本上可以了。
一步一步的指定缺失的路径,首先是flex和bison
然后是各个库
我遇到了这个spatialite版本过旧的问题
这时再次打开之前的OSGeo4W安装程序,搜索这个包并进行安装
问题还是没有解决,这时才发现原来是版本选成了VS17的,这里还是要选择VS2015 64位的版本
设置完成后继续点Configure,有错误则设置好需要的路径直到出现
然后点击Generate,其实这三个按钮点依次点过去,没问题的话就OK了,成功的话可以在指定的文件夹中看到编译成功的项目,用VS打开项目并且重新生成就可以了,当然这可能需要比较长的一段时间。
将活动解决方案设置为RelWithDebInfo,带有调试信息的Release版本。
将启动项目设置成【qgis】,选择核心的项目生成即可,这里我参考了https://blog.csdn.net/quinta_2018_01_09/article/details/79084001这篇博客。但通过查看看依赖项我发现【qgis】还需要依赖【qgis_native】这个项目,因此也把它加上去了。
然后单独编译生成【qgis_core】,如果出现以下问题,定位到出问题的cpp文件,利用记事本对其进行编辑(其他方法亦可),将其编码改为【Unicode】,虽然错误看起来很多,但是实际上几条错误都是在同一个文件中的,实际上需要修改的文件并不多,逐一修改即可。成功生成【qgis_core】后,生成其它项目,出现语法错误处理方式同上,最后生成【qgis】项目。
以上是笔者个人进行QGIS编译的一些经验,欢迎交流指导