编译qgis
转自: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%\System32\Wbem;D:\CMake-2.8.8\bin;
set PYTHONPATH=set VS90COMNTOOLS=%PROGRAMFILES%\Microsoft Visual Studio 9.0\Common7\Tools\
call "%PROGRAMFILES%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86set INCLUDE=%INCLUDE%;%PROGRAMFILES%\Microsoft Platform SDK for Windows Server 2003 R2\include
set LIB=%LIB%;%PROGRAMFILES%\Microsoft Platform SDK for Windows Server 2003 R2\libset OSGEO4W_ROOT=D:\OSGeo4W
call "%OSGEO4W_ROOT%\bin\o4w_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:\OSGeo4W\setup.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:\QGIS\build下
5.4 点击Configure时选择自己的vs环境,我选择了vs2010
5.5 遇到找不到Flex和Bison路径时,需要把刚才下载的Flex和Bison的目录设置后再继续
5.6 遇到找不到geos、sqlite3等包含头文件目录时,统一设置为D:\OSGeo4W\include,找不到库目录时统一设置为D:\OSGeo4W\lib,
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,我嫌麻烦就没弄了,我屏蔽了以下函数:
src\core\gps\qextserialport\qextserialenumerator.cpp文件中的
enumerateDevicesWin、matchAndDispatchChangedDevice、getDeviceDetailsWin三个函数的内容
5.3 成功编译后,需要设置qgis项目为启动项,并在工程属性/调试/工作目录设置为D:\OSGeo4W\bin,
5.4 启动调试,正常情况下已经可以跑起来了,不正常情况可能遇到以下问题:
无法找到sqlite3.dll,其实这个文件在D:\OSGeo4W\bin下,我把它拷贝到qgis生成的目录下,如
D:\qgis-1.8.0\build\output\bin\RelWithDebInfo\
如果说没找到其他库,估计是工作目录设置不对,或者看工作目录下是否有那个库
如果遇到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
=================================================
小结:
刚开始整了半天,感觉东西很多很杂的样子,但最后领悟到一些关键点后,
重新整的时候只花了不到半个小时,所以还是希望大家吸取经验,不要再搞半天也搞不定呀
每一个不曾起舞的日子,都是对生命的辜负。
But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采