问题:原本代码在kernel > 2.6.32的版本上编译通过,移植到当前的环境,kylin3.0,kernel = 2.6.18-SKL1.9.4.ky3.173.4.1 上,编译出现如下错误:
错误:‘CSUM_MANGLED_0’ 未声明 (在此函数内第一次使用) 错误:(即使在一个函数内多次出现,每个未声明的标识符在其 错误:所在的函数内只报告一次。)解决步骤如下: 1.因为高版本的是可用的,所以我们先看看高版本上这个是什么
# grep "CSUM_MANGLED_0" /usr/src/kernels/3.10.0-862.el7.x86_64/ -rin /usr/src/kernels/3.10.0-862.el7.x86_64/include/net/checksum.h:108:#define CSUM_MANGLED_0 ((__force __sum16)0xffff)搜索当前版本,并没有这个变量
2.可以看出,CSUM_MANGLED_0这个宏是由__force 和__sum16这两个私有宏代替的,先看一下__sum16,找到他在include/types.h中定义
通过上图可以看到,左边是高版本的,右边是当前版本,在当前版本中没有__sum16,这是由__u16 __bitwise的别名,两边都有一个相同类型的__le16,我觉得这个比那辆有搞头。
3.再看__force,通过查询,发现在linux/compiler.h中定义,再对比新旧版本,发现都有这个文件相同定义,我觉得可以用 4.找到了两个代替的变量,进行替换,编译通过,解决
519 if ( th->check == 0 ){ 520 //th->check = CSUM_MANGLED_0; 521 th->check = ((__force __le16)0xffff); 522 }