从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.
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 <Python.h>:
改为:
#ifdef
_DEBUG
#undef
_DEBUG
#include
<Python.h>
#define
_DEBUG
#else
#include
<Python.h>
#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的知识在上一篇笔记中。