转自: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" x86set INCLUDE=%INCLUDE%;%PROGRAMFILES%Microsoft Platform SDK for Windows Server 2003 R2include
set LIB=%LIB%;%PROGRAMFILES%Microsoft Platform SDK for Windows Server 2003 R2libset 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
=================================================
小结:
刚开始整了半天,感觉东西很多很杂的样子,但最后领悟到一些关键点后,
重新整的时候只花了不到半个小时,所以还是希望大家吸取经验,不要再搞半天也搞不定呀