转自:http://blog.csdn.net/jk276993857/article/details/8733113

花了半天时间编译qgis,简单小结一下:

主要参考:http://www.qgis.org/api/INSTALL.html 

==============================================

安装前注意事项:文件夹名字尽量不要用中文和空格,可能会出错

==============================================

0、下载QGIS和QGIS源码

0.1 下载QGIS,我直接在官网上的下载页面进行下载:http://hub.qgis.org/projects/quantum-gis/wiki/Download

目前的版本是1.8.0,直接的下载地址是:http://qgis.org/downloads/QGIS-OSGeo4W-1.8.0-2-Setup.exe

0.2 下载QGIS源码,可以直接在上面的下载页面的最下方下载源码

我直接下载压缩好的包,因为我平时很少用git,其地址是http://qgis.org/downloads/qgis-1.8.0.tar.bz2

也可以通过git源码管理器下载,git clone git://github.com/qgis/Quantum-GIS.git

1、下载编译工具

1.1 下载并安装CMake,由于我之前已经有过用cmake编译的经验,直接使用已经安装好的版本,我用的是2.8.8版本

1.2  下载并安装Flex和Bison,由于网站给出的链接已经无效,我又找了sourceforge上的版本http://sourceforge.net/projects/winflexbison/

我直接放在了cmake文件夹下 直接的下载地址是:http://jaist.dl.sourceforge.net/project/winflexbison/win_flex_bison-2.3.zip

1.3 下载OSGeo4W,其下载地址是: http://download.osgeo.org/osgeo4w/osgeo4w-setup.exe

2、使用OSGeo4W下载并安装一些qgis需要的库

2.1 启动OSGeo4W,选择Advanced Installation进行高级可配置化安装,点击下一步

2.2 Install from Internet 点击下一步,设置安装根目录,我设置为D:OSGeo4W,点击下一步,设置包目录,我也设置为D:OSGeo4W

此处也可以通过仅先下载,设置包目录,等下载完后,可通过再次启动进行安装,设置安装目录,这样可以进行离线操作,或进行从别的机器下载到另一台机器安装

2.3 在选中包页面中,select packages 按分类中找到libs下勾选以下必须库

expat
fcgi
gdal                  — 这个可以不选择,使用下一步骤QGIS中的安装即可
grass                — 这个可以不选择,使用下一步骤QGIS中的安装即可
gsl-devel
iconv
pyqt4
qt4-devel
qwt5-devel-qt4
sip
spatialite
libspatialindex-devel
python-qscintilla

2.4 等待下载和自动安装

3、安装QGIS到OSGeo4W安装包一致的目录

其中QGIS中大多数的库都是用OSGeo4W下载好的离线包进行安装的,因此这个过程和2中的过程的作用具有一定的相似性。

其目的是利用现有的QGIS安装程序,免去下载gdal geos grass proj osgEarth 等与GIS相关比较大的”大库”

需要注意的是安装时选择的目录需要与OSGeo4W安装包一致的目录

4、在OSGeo4W目录下写个cmd批处理脚本,比如我取名叫setup.bat

我是依照网站上的例子按自己的目录情况写的

@echo off
path %SYSTEMROOT%system32;%SYSTEMROOT%;%SYSTEMROOT%System32Wbem;D:CMake-2.8.8in;
set PYTHONPATH=

set VS90COMNTOOLS=%PROGRAMFILES%Microsoft Visual Studio 9.0Common7Tools
call “%PROGRAMFILES%Microsoft Visual Studio 9.0VCvcvarsall.bat” x86

set INCLUDE=%INCLUDE%;%PROGRAMFILES%Microsoft Platform SDK for Windows Server 2003 R2include
set LIB=%LIB%;%PROGRAMFILES%Microsoft Platform SDK for Windows Server 2003 R2lib

set OSGEO4W_ROOT=D:OSGeo4W
call “%OSGEO4W_ROOT%ino4w_env.bat”

@set GRASS_PREFIX=c:/OSGeo4W/apps/grass/grass-6.4.3RC2
@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%include
@set LIB=%LIB%;%OSGEO4W_ROOT%lib;%OSGEO4W_ROOT%lib

@cmd

以上与微软开发环境相关的东西可能本机并没有安装,但也可以先这么写着,应该不会报错

5、进行CMake编译

5.1 运行cmd,运行步骤4的脚本,比如我在cmd中

C:>  D: 回车

D:> D:OSGeo4Wsetup.bat

运行后显示OSGEO4W home is D:OSGeo4W

5.2 从cmd中运行cmake-gui.exe,重点是需要从cmd中运行,这样才可以获得到相应于5.1执行后得到的一些变量

5.3 在Where is the source code中输入源码的位置,比如我将源码解压在D:QGIS下,

Where to build the binaries中输入生成的工程目录,比如我设置在D:QGISuild下

5.4 点击Configure时选择自己的vs环境,我选择了vs2010

5.5 遇到找不到Flex和Bison路径时,需要把刚才下载的Flex和Bison的目录设置后再继续

5.6 遇到找不到geos、sqlite3等包含头文件目录时,统一设置为D:OSGeo4Winclude,找不到库目录时统一设置为D:OSGeo4Wlib,

5.7 遇到其他一些py的问题,很可能是步骤2没安装好

5.8 最后还可能遇到一个问题是setupapi找不到,可以先暂时随便设置一个错的,比如我设置的D:a.lib

5.9 Configure完后没问题了就可以genarate,有问题就需要年是不是步骤2和步骤4的过程有问题

5.10 如果需要其他一些配置,可以自己研究

6、在vs2010中编译

6.1 从 build文件夹中找到由cmake生成的2010解决方案文件qgis.sln

6.2 编译qgis_core,qgis_gui,qgis_analysis,qgis这四个库

注意不能直接选择Debug编译选项,而要选择Relase或者RelWithDebinfo,因为OSGeo4W中的库是没有degug信息的

当找不到5.8中设置的错误setupapi库时,如找不到D:a.lib需要在工程属性/链接器/输入/附加依赖项设置中删除该引用

当编译结束发现无法找到setupapi引用的函数时,需要把相应的几个函数内容屏蔽,不影响程序生成,只影响后续安装

如果希望能正确安装,还需要根据自己的系统下载相应的window开发 sdk,我嫌麻烦就没弄了,我屏蔽了以下函数:

srccoregpsqextserialportqextserialenumerator.cpp文件中的

enumerateDevicesWin、matchAndDispatchChangedDevice、getDeviceDetailsWin三个函数的内容

5.3 成功编译后,需要设置qgis项目为启动项,并在工程属性/调试/工作目录设置为D:OSGeo4Win,

5.4 启动调试,正常情况下已经可以跑起来了,不正常情况可能遇到以下问题:

无法找到sqlite3.dll,其实这个文件在D:OSGeo4Win下,我把它拷贝到qgis生成的目录下,如

D:qgis-1.8.0uildoutputinRelWithDebInfo

如果说没找到其他库,估计是工作目录设置不对,或者看工作目录下是否有那个库

如果遇到0xc000000d无法启动的错误,那就比较悲剧,

不过我的解决方案是把以上几个工程属性/链接器/清单文件/生成清单设置为否,再链接并调试就没问题了,参考如下:

http://stackoverflow.com/questions/5648391/c-application-fails-to-start-correctly-0xc000000d

=================================================

关键问题解析

1、使用OSGeo4W和QGIS的安装包都是为了提供一整套代码编译过程中需要依赖的工具和库,

一方面是c++的头文件和lib,另一方面特别是python相关的东西我是搞不定的

如果发现有文件找不到,可以先查找一下文件夹下是否存在,如果不存在可能是下载安装有问题,

如果存在,但找不到再看是不是目录设置错误,或者是脚本路径没写对

2、从cmd里运行,并且写步骤4中的脚本都只是为了提供一些路径的快速设置,

以便cmake只需要一个根目录就可以快速找到其他的目录

如果你发现cmake中还需要设置大量的位置问题,那就是没写好bat

3、目录的设置还是有一点诀窍的,源码是需要依赖库文件的,

因此所有的库文件肯定是要统一管理,而OSGeo4W的组织方式统一,很方便使用,

源码可以不和OSGeo4W放一起,但最后生成的程序是需要再放到其依赖库下进行链接dll

=================================================

小结:

刚开始整了半天,感觉东西很多很杂的样子,但最后领悟到一些关键点后,

重新整的时候只花了不到半个小时,所以还是希望大家吸取经验,不要再搞半天也搞不定呀