当前位置: 首页 > 工具软件 > Navit > 使用案例 >

用cegcc编译navit

李振国
2023-12-01
 

navit版本: r4846,cegcc版本: 0.59.1
官方网站上介绍可以用mingw32ce来做,但是我试了一下有问题就没有再深入,改为用cegcc来做,不过也花了一些时间。

配置脚本内容如下:
PATH=/opt/cegcc/bin:$PATH \
CFLAGS="-I/usr/wince/include -mwin32 -DWIN32 -D_WIN32_WCE=0x0600 -D_WIN32_IE=0x0400 -Wl,--enable-auto-import" \
LDFLAGS="-L/usr/wince/lib -lws2" \
./configure --host=arm-cegcc --prefix=/usr/wince/ \
            --disable-vehicle-file --disable-graphics-gtk-drawing-area --disable-svg2png \
            --enable-support-libc --disable-gmodule --disable-glib --disable-binding-dbus \
            --disable-font-freetype --disable-gui-gtk --disable-gui-win32 --disable-graphics-qt-qpainter \
            --enable-cache-size=8000000 --disable-graphics-null --disable-map-mg --disable-speech-cmdline \
            --with-saxon=saxonb-xslt --disable-vehicle-demo

需要注意的是"--enable-support-libc"、"--disable-glib"必须要加的,因为navit内带的glib不是为WIN32准备的。另外cegcc自带了newlib,所以在编译过程中会出现一些错误,解决办法列举如下:

一、编译会提示_ssize_t重定义,在navit的libc中可以查到在support/libc/sys/types.h有定义,如果只是简单的注释它会造成cegcc的下面几个地方出问题
1、<stdio.h>
ssize_t _EXFUN(__getdelim, (char **, size_t *, int, FILE *));
ssize_t _EXFUN(__getline, (char **, size_t *, FILE *));
2、<sys/uio.h>和<sys/socket.h>中返回值为ssize_t的几个函数

因此为尽量不改动cegcc环境,针对navit做如下修改
"support/libc/sys/types.h"中_ssize_t和ssize_t的定义
#include <sys/_types.h>
#ifndef _SSIZE_T_
#define _SSIZE_T_
//typedef long _ssize_t;

#ifndef _NO_OLDNAMES
typedef _ssize_t ssize_t;
#endif
#endif /* Not _SSIZE_T_ */

二、<time.h>中变量clock_t未定义,先暂时注释
//clock_t    _EXFUN(clock,    (void));

三、<bits/socket.h>中变量pid_t、uid_t、gid_t未定义,先暂时注释
/*struct ucred
{
  pid_t pid;   /* PID of sending process.  */
  uid_t uid;   /* UID of sending process.  */
  gid_t gid;   /* GID of sending process.  */
};*/

四、navit中需要改动
1、"support/libc/libc.h"中popen、pclose声明重定义,注释掉然后参照cegcc中声明(stdio.h)修改函数
2、"support/libc/libc.c"中unsetenv声明重定义,参照cegcc中声明(stdlib.h)修改函数,并加入#include <stdio.h>
3、"support/libc/libc.c"中rewind声明重定义,参照cegcc中声明(stdio.h)修改函数
4、"graphics/win32/graphics_win32.c"中BLENDFUNCTION、AC_SRC_OVER、AC_SRC_ALPHA重定义,注释
 
五、socket问题
1、有大量的重定义错误,是util.h中引用了<winsock.h>,实际上只需要用到timeval结构,改成<sys/time.h>就可以了。
2、链接错误,需要链接winsock库,在wince下是libws2.lib而不是libws2_32.lib,这个在configure中可以看出是错误的,不想改configure就直接将"-lws2"加到配置文件LDCFLGS中

至此,一个最基本的东西就出来了,但是还需要加入GUI和地图数据等构成一个完整系统。

 类似资料: