声明:整理网上大牛的博客,借用可以使用的相关叙述和图解,因涉及博客网址来源太多,这里不做详细说明了,本博客的目的只是为了方便大家借鉴,如有侵权请告知。
一、资源准备
1、QGIS 2.18.23源码:QGIS官网
2、Qt 5.9.3:QT官网
3、VS2010:
可以通过VS自带的工具扩展下载Qt插件QtPackage,然后把Qt*.*的msvc2010_64设置过去;
4、CMake:官网下载
5、cygwin(用于下载flex及bison):
说明:(1)View选择Category;(2)Search输入要下载的内容,本工具只用下载flex和bison;(3)选择Devel,展开,如果当前未下载则显示的是"Skip",点击会变成具体的版本,然后点击下一步即可下载(由于我这边都下过了,所以显示的是keep)。按照这里的说明,分别下载flex和bison即可;(4)上述路径不要有中文或空格。
6、osgeo4w(主要用于下载gdal等):
说明:(1)这里的操作和Cygwin基本一致;(2)Search输入要下载的内容,具体包括:expat、fcgi、gdal、grass、gsl-devel、iconv、libspatialindex-devel、pyqt5、python3-devel、python3-qscintilla、python3-nose2、python3-future、python3-pyyaml、python3-mock、qca-qt5-devel、qca-qt5-libs、qscintilla-qt5、qt5-devel、qt5-libs-debug、qtwebkit-qt5-devel、qtwebkit-qt5-libs-debug、qwt-devel-qt5、sip-qt5、spatialite、qjson;(3)上述路径不要有中文或空格。
二、编译过程
1、制作bat设置环境变量:
先贴我这边的bat文件,保存成path.bat(随便命名就行)
@echo off
set VS140COMNTOOLS = C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
set INCLUDE=%INCLUDE%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
set LIB=%LIB%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib
set OSGEO4W_ROOT=C:\QGIS\OSGeo4W64
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
path %PATH%;D:\Program Files\CMake\bin;C:\QGIS\cygwin64\bin;C:\QGIS\OSGeo4W64\apps\Python36
@set GRASS_PREFIX=C:/QGIS/OSGeo4W64/apps/grass/grass-7.2.2
@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include
@set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib
@cmd
说明:(1)VS140COMNTOOLS表示VS15,call后续跟的X64表示64位编译;(2)Include表示头文件,这里加了Win10系统的sdk;Lib表示编译的动态库;(3)Path表示环境变量;(4)特别注意:GRASS_PREFIX的路径地址必须是“/”,Path路径多个;之间不能有空格。
2、启动Cmake进行配置:
点击:Configure,如果遇到错误,则解决(手动配置路径即可),以下是我这边配置的最终图:
最终配置完成后,没有错误,图如下:
3、CMake生成解决方案:
4、启动VS编译解决方案:
(7)接下来缺少什么就安装什么,直至没有错误
(8)完成后点击Generate,编译完成后就可以看到vs解决方案了
三、 vs2010编译
(1) 打开解决方案属性,在项目依赖项里可以看到启动QGIS所依赖的工程,例如:qgis_app,当然qgis_app也有依赖项,以此类推
所有需要的项目如下:
名称 |
说明 |
qgis |
QGIS可执行程序 |
qgis_analysis |
依赖项 |
qgis_core |
依赖项,QGIS核心库 |
qgis_gui |
依赖项,QGIS界面库 |
ui |
QGIS所有的界面 |
gdalprovider |
读取栅格数据驱动 |
ogrprovider |
读取矢量数据驱动 |
(2)卸载不依赖的项目,保留依赖项目,将qgis设为启动项
(3) 将环境改为RelWithDebInfo,编译就没什么问题了
(4)生成的所有文件在 Buide – output – bin – RelWithDebInfo目录下,启动qgis会提示少相应的.dll文件,我们从Osgeo4W安装的bin目录下找到相应的.dll文件放到RelWithDebInfo目录下即可正常启动
四、 部分截图
图 1 gdalprovideInclude
图 2 gdalprovideLib
图 3 ogrProviderLib
图 4 ogrProvidernclude
图 5 qgis_analysisInclude
图 6 qgis_analysisLib
图 7 qgis_appInclude
图 8 qgis_appLib
图 9 qgis_coreInclude
图 10 qgis_coreLib
图 11 qgis_guiInclude
图 12 qgis_guiLib
图 13 qgisInclude
图 14 qgisLib
五、 打开数据
参考:http://blog.csdn.net/liminlu0314/article/details/17400075
所有的工程编译完之后,会在Build目录下面的D:\qgis\build\output\bin\RelWithDebInfo目录生成dll和exe,然后只需要将QGIS所有依赖的dll拷贝过来就可以双击qgis.exe运行了。依赖的dll主要有gdal、geos、proj、qt、qwt等。需要注意的是,要把gdalprovider.dll和ogrprovider.dll放到exe目录的plugins目录
六、QGIS图标显示
参考:http://blog.csdn.net/deirjie/article/details/50446033
只需要将”imageformats”这个文件夹全部拷贝到”qgis.exe”路径下就可以了。如下图
5、启动自己编译的Qt软件:
将OSGeo4W64\apps\Qt5\bin下的dll全部拷贝到同目录下,启动qgis.exe,会报错如下:
此时,只需将OSGeo4W64\apps\Qt5\plugins文件下的platforms文件夹拷贝到刚才的目录即可,截图如下:
这我已经汉化了,汉化方法为选择菜单Setting下的options,按照下图进行进行操作,设置完后,重启qgis汉化就完成了
到此,qgis编译的工作就全部完成。
最终启动qgis.exe,效果图如下
常见问题:
终于把这个问题解决了
这个问题的本质是链接需要debug版的QtUiTools.lib,但编译器只找到release版的库
如果按照楼上的办法把debug改成release,那么生成的qgis也是release版本,而不是debug,是不能调试的。
解决方法:
用OSGeo4W下载qt4-libs-debug, 里面就带有debug版的库,然后在CMake中把QT_QTUITOOLS_LIBRARY_DEBUG指向新下载的对应的库的位置即可。
类似问题都可以这么解决。
检测到"_ITERATOR_DEBUG_LEVEL"的不匹配项
error:
vtkCommon.lib(vtkSmartPointerBase.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不匹配值“2”(cloudviewer.obj 中)
1>vtkCommon.lib(vtkGarbageCollector.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(cloudviewer.obj 中)
1>vtkCommon.lib(vtkDebugLeaksManager.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(cloudviewer.obj 中)
错误原因是:Debug使用了Release的库文件。
即使你连接库里面两个都添加着呢,但是release库文件放在了debug前面,也是出错的。默认按顺序使用库文件。
类似错误:如release下使用了Debug的库文件,报错类似:
error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”.
小问题花大时间!哎
值“2”不匹配值“0”.解决办法:
详细考证后,发现这一选项vs提供了设定。即只需要在预处理定义中设定其值符合要调用的程序设定即可。vs2010中,debug模式下默认值为2,release的模式的默认值为0 。其设定方法如下:
项目-〉属性-〉配置属性-〉C/C++ -〉预处理器-〉预处理定义 -〉添加“_ITERATOR_DEBUG_LEVEL=0”即可。