1. LINUX/Makefile 加入以下变量,由于要跨平台编译修改编译工具链
CROSS_COMPILE = rsdk-linux- #这里根据各个平台的编译工具链来写可能是:arm-linux-, mips-linux- 等等
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
2. LINUX/main.c 将下面的代码注释,因为开发板不一定有主机名,所以要将这段代码注释,直接以IP的形式访问
/*
if ((hp = gethostbyname(host)) == NULL) {
error(E_L, E_LOG, T("Can't get host address"));
fprintf(stderr,"initWebs: host name %s/r",host);
return -1;
}
memcpy((char *) &intaddr, (char *) hp->h_addr_list[0],
(size_t) hp->h_length);
*/
intaddr.s_addr = inet_addr("192.168.1.6"); // eth0 网卡IP
注:
0. 移植的时候问题千奇百怪,但最终的目标就是让一个程序到目标平台能够顺利运行
1. 由于平台不同,可能二进制文件的存储格式也不尽相同,所以要使用不同的编译工具链,在Makefile中指出,最好是用CC,LD,AR...变量来表示这些工具链
2. 库函数的有无,在移植2.5 版本的时候遇到一个readdir_r这个函数,这个函数在目前的开发板上好像没有提供,又不知道如何用其他函数代替这个函数,花了两天的时间,只能移植其他版本的了,用最稳定的那个2.1.8版本吧 。移植的时候要考虑目标板的库函数和当前平台的库函数是否相同,其实只要用目标工具链编译之后,放到目标平台就OK了,一运行。就出来了。
3. 在不同的平台上,一个程序的部分逻辑可能会被改变。 如上面的IP访问设备。这个设备根本就没有主机名,但在普通的PC是有的。
4. 当自己不会移植的时候,到Baidu,Google,看有没有现成的移植解决方案,改改,变成自己的,但是一定要从中学到完整的移植思路,这个才是最为重要的
5. 在以前的WEBServer 和Goahead 之间纠结了几天,最终还是选择了goahead... 一切向前看吧,goahead提供的强大的功能根本就不是以前的那个服务器能比的,尽管以前写了很多的代码,需要重构这一切,但这是值得的