今日看到MapServer已经更新到了5.6.1,我目前还在使用5.4.2版本,看了一下变动不少,增加了很多新功能,像opengl渲染,xml格式的mapfile。还修改了不少bug,我以前说到的symbolObj.inmapfile问题也在5.6.1中得到了解决。
如此多的变动很吸引人,于是决定下载代码编译一份看看。
因为以前编译过5.4.2,因此所有的依赖库都在,直接把5.6.1代码扔到了原来的编译目录之下,按照以前的经验,修改了nmake.opt文件中的几个常用参数之后就开始编译了。(具体的编译步骤可以看看makefile.vc以及nnake.opt文件,网上也有很多介绍,这里不做说明)
很不幸的是出现了编译错误如下:
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2601) : error C2054:
在“inline”之后应输入“(”
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2601) : error C2085:
“msBufferInit”: 不在形参表中
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2602) : error C2061:
语法错误 : 标识符“inline”
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2603) : error C2370:
“inline”: 重定义;不同的存储类
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2601) : 参见
“inline”的声明
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2603) : error C2054:
在“inline”之后应输入“(”
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2603) : error C2085:
“msBufferFree”: 不在形参表中
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2604) : error C2082:
形参“inline”的重定义
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2604) : error C2143:
语法错误 : 缺少“;”(在“类型”的前面)
d:/work/mapserver-buildkit-2008/mapserver-5.6.1/mapserver.h(2604) : error C2085:
“msBufferAppend”: 不在形参表中
mapbits.c(35) : error C2085: “ms_cvsid”: 不在形参表中
mapbits.c(35) : error C2143: 语法错误 : 缺少“;”(在“=”的前面)
mapbits.c(35) : error C2065: “ms_cvsid”: 未声明的标识符
mapbits.c(35) : warning C4047: “:”: “char *”与“int”的间接级别不同
NMAKE : fatal error U1077: “"d:/Program Files/Microsoft Visual Studio 9.0/VC/BI
N/cl.EXE"”: 返回代码“0x2”
Stop.
开始怀疑是编译器的错误,本来是用的编译器版本是.vs2008,更换为vs2003之后错误依然存在,仔细看了一下错误信息,找到了mapserver.h文件中的2601行:
inline void msBufferInit(bufferObj *buffer);
inline void msBufferResize(bufferObj *buffer, size_t target_size);
按照编译错误的提示来看应该是编译器没有识别inline参数。查阅了一下inline是c++里面的东西,在c里面使用是会发生错误。
解决办法就是将inline修改为__inline或者在mapserver.h中增加了如下的定义:
#define inline __inline
做了如此修改之后顺利地编译通过。