QGIS2.3.0 VS2008调试版编译记录

从Qt官网下载的VS2008的安装包,发现编译好的debug版本,qgis.exe回闪退,调试跟踪到\src\app\gps\qgsgpsinformationwidget.cpp中语句时直接退出:mpPlot = new QwtPlot( mpHistogramWidget );即使把qwt5重新编译也没能解决问题。所以只好把找到Qt4.8.6的源码,自己编译出来debug和release,然后使用编译好的库,编译qwt5。然后使用python2.7.4和vs2008编译器编译debug和release版本的pyQt4.9.6和sip4.14.2。

编译时要注意依赖库的版本问题,相关编译教程在网上都可以找到。

什么是sip?

Python extension module generator for C and C++ libraries

SIP is an extension module generator similar to SWIG but is specifically designed for creating Python modules. Generated code can be compiled for Python v2 and v3.
QGIS2.3.0 VS2008调试版编译记录_第1张图片

1.使用VS2008中,编译 QGis2.3.0时,Qt选择了4.8.6,python2.7.4,pyQt4使用4.9.6时,要求sip版本>=4.14.2;

2.sip.h和qgspythonutilsimpl.cpp文件中的 #include
     改为:
      #ifdef  _DEBUG
  #undef  _DEBUG
  #include 
  #define  _DEBUG
#else
  #include 
#endif

如果后面调试debug程序时能够加载python插件,那么这一步就不要这样做了,必须使用python27_d.lib,python的插件都名字都要以_d结尾。

3.\QGIS\3rdparty_vc9\bin\pyuic4.bat
该批处理命令中,指定了python.exe的绝对路径,也可以仅仅设置python.exe,只要在系统环境变量即可
这里不要出错了,切记啊!
4.“spatialiteprovider ”工程中有宏定义,SPATIALITE_VERSION_GE_4_0_0,所以最好spatialite的版本要大于或等于4.0.0。在qgsspatialiteprovider.h文件中有:
#ifdef  SPATIALITE_VERSION_GE_4_0_0
     // only if libspatialite version is >= 4.0.0
     bool  checkLayerTypeAbstractInterface  (  gaiaVectorLayerPtr  lyr  );
     bool  getGeometryDetailsAbstractInterface  (  gaiaVectorLayerPtr  lyr  );
     bool  getTableSummaryAbstractInterface  (  gaiaVectorLayerPtr  lyr  );
     void  loadFieldsAbstractInterface  (  gaiaVectorLayerPtr  lyr  );
     void  getViewSpatialIndexName  ();
#endif

5.spatialite
注意它的include_dir是../3rdparty_vc9/include

6.在spatialiteprovider工程,如果使用的libspatialite版本大于或等于4.0.0,那么就要提供一个宏定义: SPATIALITE_VERSION_GE_4_0_0,否则会提示“obsolete libspatialite: connecting to this DB requires using v.4.0 (or any subsequent)"

7.debug模式下,python模块或基于python的插件,其模块名字都要有个后缀“_d”,然后是.pyd,切忌!

8.在CMake configure时,会调用python.exe生成..\vs2008build\python,是sip工具生成的cpp代码,关于sip的知识在上一篇笔记中。

你可能感兴趣的:(GIS,QGIS,VS2008,编译)