QGIS2.18.23 源码编译 VS2010(X64)-综合整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/C_Bright/article/details/82732524

声明:整理网上大牛的博客,借用可以使用的相关叙述和图解,因涉及博客网址来源太多,这里不做详细说明了,本博客的目的只是为了方便大家借鉴,如有侵权请告知。

一、资源准备

  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)

  地址:Cygwin-setup-x86_64

    

  

  

  

  

  

  说明:(1)View选择Category;(2)Search输入要下载的内容,本工具只用下载flex和bison;(3)选择Devel,展开,如果当前未下载则显示的是"Skip",点击会变成具体的版本,然后点击下一步即可下载(由于我这边都下过了,所以显示的是keep)。按照这里的说明,分别下载flex和bison即可;(4)上述路径不要有中文或空格。

  6、osgeo4w(主要用于下载gdal等)

  地址:osgeo4w-setup-x86_64

  

  

  

  

  

  

  

  说明:(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目录生成dllexe,然后只需要将QGIS所有依赖的dll拷贝过来就可以双击qgis.exe运行了。依赖的dll主要有gdalgeosprojqtqwt等。需要注意的是,要把gdalprovider.dllogrprovider.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”即可。

猜你喜欢

转载自blog.csdn.net/C_Bright/article/details/82732524