ShapeLib是一个用C编写的开源Shape文件操作库,提供对Shp和DBF文件的操作函数。一般来说,希望将其编译成独立的dll文件后在自己的项目中使用,从网站上下载其最新源码http://dl.maptools.org/dl/shapelib/
幸运的是,如果您的项目是基于Windows的,那么可以直接从网站上下载到编译好的.dll,甚至可以找到.net wrapper http://shapelib.maptools.org/dl/contrib/DotNetArchive.zip
可咱偏偏需要在Window Mobile上使用这个东东,没办法只有自己编译了。编译之前请确保安装了Windows Mobile SDK。
编译过程如下:
1、下载源码后,在Visual Studio中创建一个VC++的Win32 智能设备项目,项目类型为动态链接库
2、将源码的shapefil.h、dbfopen.c、shpopen.c、shptree.c、shapelib.def加入项目;
3、打开项目属性对话框,展开配置属性\c/c++\预处理,在预处理定义中增加SHPAPI_CALL=__stdcall
4、展开配置属性\c/c++\代码生成,选择运行库为多线程调试 DLL (/MDd),当然如果是编译Release版本可以选择多线程 DLL
理论上即可编译完成,但在Windows Mobile平台上还没有这么简单,因为其不支持time.h,幸好openNETCF提供了开源的实现,可以在http://www.opennetcf.com/FreeSoftware/OpenTimeCE/tabid/247/Default.aspx下载其源码
5、将time_ce.h和time_ce.cpp加入项目,此时需要确保编译器具有/Tp选项(编译为c++代码,默认)
6、修改shptree.c
497~499行修改为:
psTreeNode->panShapeIds =
(int*) SfRealloc(psTreeNode->panShapeIds,
sizeof(int) * psTreeNode->nShapeCount );
504~507行修改为
psTreeNode->papsShapeObj =
(SHPObject**)SfRealloc( psTreeNode->papsShapeObj,
sizeof(void *) * psTreeNode->nShapeCount );
7、修改dbfopen.c
194行修改为:#include "time_ce.h"
8、修改time_ce.h 。好吧,我承认要给出最丑陋的代码了。
在文件最后#endif前边增加:
#define time time_ce
#define time_t time_t_ce
#define localtime localtime_ce
9、如果是在Windows Mobile 5.0以上的环境编译,还需要修改time_ce.h
在35行#pragma comment(lib, "secchk.lib")前增加注释。
至此即可顺利完成编译。