移植ShapeLib到WinCE平台

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 智能设备项目,项目类型为动态链接库

image

2、将源码的shapefil.h、dbfopen.c、shpopen.c、shptree.c、shapelib.def加入项目;

3、打开项目属性对话框,展开配置属性\c/c++\预处理,在预处理定义中增加SHPAPI_CALL=__stdcall

image

4、展开配置属性\c/c++\代码生成,选择运行库为多线程调试 DLL (/MDd),当然如果是编译Release版本可以选择多线程 DLL

image

理论上即可编译完成,但在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")前增加注释。

至此即可顺利完成编译。

posted @ 2008-11-13 12:47  雨吁的嘘  阅读(1611)  评论(2编辑  收藏  举报