WinXP+VS2008+qgis2.6.0源码调试笔记(离线安装)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WinXP+VS2008+qgis2.6.0源码调试笔记(离线安装)
时间:2014年11月22日
1.准备工作
1.1下载QGIS源码
Qgis源码可在官网上下载,当前的最新版本是Qgis2.6.0版本。
1.2下在Visual Studio 2008 Pro
下载离线破解版
1.3下载Qgis编译所需的依赖工具
1.3.1 CMake
Qgis跟大多数开源工程一样,也是采用Cmake编译的。
CMake的版本要求
CMake >= 2.8.0,本人采用CMake2.8.12。
下载地址:/files/v2.8/cmake-2.8.12.2-win32-x86.exe
1.3.2 flex&bison
flex和bison目前提供的window安装包版本太老,截至2013年Windows 安装包flex 的版本是 2.5.4a(/downlinks/flex.php),而最新的flex 版本是 2.5.37;Windows安装包bison的版本是 2.4.1(/downlinks/bison.php),而现在最新的bison版本是3.0。
对于Qgis2.6.0不能采用目前提供的flex和bison的windows 安装包(Qgis1.8.0之前的版本是可以的,编译的时候会出现问题,后面细说)。
既然flex和bison的windows 安装包不能用,那该怎么办呢?有两种解决思路:
a)下载flex2.5.37和bison 3.0的源码,通过Cygwin或Mingw安装;(有点麻烦,本人
木有试~)
b)从sourceforge上下载最新版的Win flex-bison安装包win_flex_bison-latest.zip,本人下载
的版本包含win_flex2.5.37和win_bison3.0,不需要安装,直接将安装包解压到指定目录,确保目
录中没有空格,本人的目录为C:\GnuWin32\win_flex_bison。
(注意:最新的Win flex-bison在
vs2008中还不能直接使用,在vs2010中是可以直接使用的,由于本人安装了VS2008,所以还得进行一系列规则配置,后面细说)
1.4下载编译所依赖的库
第三方库是通过OSGEO4W提供的,首先下载OSGEO4W安装包
/osgeo4w/osgeo4w-setup-x86.exe (32bit)
or /osgeo4w/osgeo4w-setup-x86_64.exe (64bit)其次,下载OSGEO4W中的依赖库,
∙expat
∙fcgi
∙gdal
∙grass
∙gsl-devel
∙iconv
∙pyqt4
∙qt4-devel
∙qwt5-devel-qt4
∙sip
∙spatialite
∙libspatialindex-devel
∙python-qscintilla
由于是离线下载,在离线主机上,继续安装OSGeo4W安装包,选择高级安装,选择从本地安装,选择刚才下载的依赖库,继续安装,则编译所依赖的库文件安装完成。
2.环境变量设置
新建一个setup.bat文件,输入以下
@echo off
set VS90COMNTOOLS=%PROGRAMFILES%\Microsoft Visual Studio
9.0\Common7\Tools\
call "%PROGRAMFILES%\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86 set INCLUDE=%INCLUDE%;%PROGRAMFILES%\Microsoft
SDKs\Windows\v7.1\include
set LIB=%LIB%;%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\lib
set OSGEO4W_ROOT=C:\OSGeo4W
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
path %PATH%;%PROGRAMFILES%\CMake
2.8\bin;%PROGRAMFILES%\GnuWin32\bin
@set GRASS_PREFIX=c:/OSGeo4W/apps/grass/grass-6.4.4
@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include
@set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib
@cmd
保存,双击运行setup.bat, 如果控制台出现,
说明你的vs的环境变量设置正确,否则请检查以上步骤。
3.CMake配置
3.1从cmd中运行cmake-gui.exe,重点是需要从cmd中运行,这样才可以获得通过setup.bat设置的环境变量的值。
3.2 在Where is the source code中输入源码的位置,比如我将源码解压在D:\QGIS下,在Where to build the binaries中输入生成的工程目录,比如我设置在D:\QGIS\build下
3.3 点击Configure时选择自己的vs环境,我选择了vs2008
3.4 遇到找不到Flex和Bison路径时,需要把刚才下载的Flex和Bison的目录设置后再继续点击Configuration;
3.5遇到找不到geos、sqlite3等包含头文件目录时,统一设置为D:\OSGeo4W\include,找不到库目录时统一设置为D:\OSGeo4W\lib,
3.6设置SETUPAPI_LIBRARY为sdk中的SetupAPI.Lib,如果没有安装SDK,则需安装相应版本的SDK。
具体的设置项,如图所示:
设置完成后点击Configure,选择Visual Studio 9(2008) 出现configure done 之后,点击generate,出现generate done之后,就可以进行编译了。
注意:1.CMAKE_INSTALL_PREFIX的值默认为C:\Program Files\qgis2.6.0,表示编译完成的qgis2.6.0的安装目录,该目录可以修改。
2.注意SPATIALITE_INCLUDE_DIR的目录得设为C:\OSGEO4W\include,而不能设为C:\OSGEO4W\include\spatialite,否则编译的时候可能会出现error C3861:”spatialite_init”:
找不到标识符。
4.编译前配置VS2008+win flex_bison
由于win flex_bison中自带的规则只使用于VS2010,因此在VS2008中使用win Flex_bison需要进行相关配置。
VS2010 + win flex_bison,参考《Visual Studio custom build rules- These steps help you setup custom build rules for Visual Studio 2010 and up.》
VS2008 + win flex_bison,参考《Using flex and bison in MSVC++》
下面详细介绍一下VS2008 + win flex_bison的配置过程吧,主要参考《Using flex and bison in MSVC++》一文提到的方法。
4.1在vs2008项目中添加自定义生成规则
用vs2008打开F:\xffang\QGIS\build\qgis2.6.0.sln,右键点击项目ALL-BUILD->自定义生成规则,进入VC++自定义生成规则文件界面;继续选择新建规则文件,设置:规则名称:Flex and Bison Tools
文件名:FlexBison.rules
规则存放目录:D:\flex_bisonRule
点击确定,完成规则文件创建,之后在vs2008中编译的所有flex_bison相关项目都用此规则。
D:\flex_bisonRule目录下生成的规则文件如图:
在VC++自定义生成规则文件界面;紧接着选择修改规则文件,
点击添加生成规则按键,添加两个生成规则,分别为Bison和Flex,主要Bison规则一定要在flex之前。
Bison规则设置:
Flex规则设置:
定制好的规则文件设置如下:
5.编译-生成代码
更换解决方案配置Debug为RelWithDebInfo; 项目右键-生成,开始进行编译,由于整个编译过程十分漫长,因此只编译Qgis依赖的项目。
ALL-BUILD
6.安装
将qgis项目设为启动项目,点击INSTALL安装,可能会出现缺少qwt5.dll的错误,
其原因是环境变量中没有添加qwt5.dll所在的目录C:\OSGeo4W\bin;或者直接将qwt5.dll 拷贝到vs目录下,继续INSTALL安装,安装完成之后,点击安装目录下的qgis.exe,默认安装目录为C:\Program Files\qgis2.6.0\bin,出现QGIS界面提示,说明安装成功。
附:注意问题
(1)环境变量设置
除了运行setup.bat自动设置环境变量外,一定要把win flex_bison的解压目录、OSGeo4W 安装bin目录、Cmake安装bin目录、setupAPI.lib目录添加到环境变量Path中;
解决方法:环境变量最好全部都提前设好,避免编译出现其他错误。
(2)win flex_bison一定要解压到没有空格的目录下,并且在CMake中要配置正确路径,
否则,可能出现C:\GnuWin32\win_flex_bison\win_bison.exe: m4 :No such file or directory 或者Project: error PRJ2019:某个工具从以下位置返回了错误代码:“Generating qgsexpressionparser.cpp”等类似错误,
解决方法:
a) C:\GnuWin32\win_flex_bison\win_bison.exe: m4 :No such file or directory,问题只能是重新解压win flex_bison到无空格的路径
b) CMake中Bison路径设置不正确可能会导致qgsexpressionparser.cpp生成问题,
打开BuildLog.htm可以看到,编译出错位置的命令,
除了正确配置CMake路径之外,还可以通过手动编译来解决:
在命令行进入到win flex_bison解压目录,运行:
win_bison.exe -oF:/QGIS/build/src/core/qgsexpressionparser.cpp –d –v –t
F:\QGIS\Source\qgis-2.6.0\src\core\qgsexpressionparser.yy
则可生成qgsexpressionparser.cpp。
c) 也有可能由于CMake中Flex路径设置不正确导致flex_qgsexpressionlexer.cpp生成问题,如
本应该为:C:/GnuWin32/win_flex_bison/win_flex.exe (本人为复现错误,估计修改的)
打开BuildLog.htm可以看到
同样,除了配置CMake路径外,可手动运行:
win_flex.exe -oF:/QGIS/build/src/core/flex_qgsexpressionlexer.cpp
F:/QGIS/Source/qgis-2.6.0/src/ core/qgsexpressionlexer.ll
可生成flex_qgsexpressionlexer.cpp。
(3)将unistd.h头文件添加到VS2008安装目录下的include中去;C:\Program Files\Microsoft
Visual Studio 9.0\VC\include
作用: 如果没有添加,生成的qgsexpressionparser为.c文件,而不是.cpp
若添加unistd.h,则生成:
unistd.h文件可以从旧版本GNU安装目录Include下获取。
(4)如果安装了低版本的flex和bison,可能出现问题:
Line22: “../src/core/qgsexpressionlexer.ll”Unrecognized %option
或者Line24: “../src/core/qgsexpressionlexer.ll”Unrecognized %bison-bridge 因此只能安装新版的win flex-bison
(5)注意,CMake中的SPATIALITE_INCLUDE_DIR的目录得设为C:\OSGEO4W\include,
而不能设为C:\OSGEO4W\include\spatialite,否则编译的时候可能会出现error C3861:”spatialite_init”:找不到标识符。
可参考的文件:
1.Building QGIS from source - step by step 官网文件
ing flex and bison in MSVC++
3.《Visual Studio custom build rules- These steps help you setup custom build rules for Visual
Studio 2010 and up.》
其他:
后记:搞了三四天终于搞定了,一定要认真细心环境变量的设置和CMake目录的设置会减少很多麻烦,其次,安装最新版的win flex_bison, 其他问题也都会迎刃而解的。