【已解决】Ubuntu下Eclipse中交叉编译一个C项目出错:Type ‘immap_t’ could not be resolved

【问题】

之前已经折腾完毕:

【记录】Ubuntu下使用Eclipse编译一个基于makefile的C项目

期间,也解决过类似的N多问题:

【已解决】Eclipse通过Makefile调用交叉编译器交叉编译C项目出错:Type ‘FILE’ could not be resolved

【已解决】Eclipse中交叉编译C项目出错:Symbol ‘SETVAL’ could not be resolved

【已解决】Ubuntu下Eclipse中交叉编译C项目出错:Symbol ‘NULL’ could not be resolved

【已解决】Ubuntu下Eclipse中交叉编译C项目出错:Symbol ‘off’ could not be resolved

但是此处,虽然没有编译那个BSP中的Uboot,但是Eclipse由于找不到对应的结构体变量,结果还是报错:

Description    Resource    Path    Location    Type
Type ‘immap_t’ could not be resolved    mem_to_mem_idma2intr.c    /HART-IP/BSP/Bootloader/u-boot-1.1.4-whgs/examples    line 157    Semantic Error

如图:

Type immap_t could not be resolved

 

【解决过程】

1.很明显,是找不到immap_t的定义。

2.去找immap_t,参考:

Linux Cross Reference immap_t

看到都是ppc的。

且看到头文件是:

3.参考:

accessing immap_t * variable in mpc8260

[U-Boot-Users] [PATCH 04/18] Stop using immap_t for guts offset on 85xx

知道了mpc中也是。

好像是ppc和mpc是同一个东西,即ppc是机构,mpc是板子?

4.参考:

[U-Boot] [PATCH] I2C: Fix CodingStyle issues in soft_i2c.c

其是一个patch,真的是soft_i2c.c

但是其中的代码,和此处得很类似:

volatile immap_t *immap = (immap_t *) CFG_IMMR;
...
uint dpalloc (uint size, uint align)
{
...
	volatile immap_t *immr = (immap_t *) CFG_IMMR;
    ...

但是此处没有添加任何define。

5.然后后来在:

/HART-IP/BSP/Bootloader/u-boot-1.1.4-whgs/examples/Makefile

中看到了对应的配置:

# The following example is 8260 specific...
ifeq ($(CPU),mpc8260)
SREC   += mem_to_mem_idma2intr.srec
BIN    += mem_to_mem_idma2intr.bin mem_to_mem_idma2intr
endif

即, 只有定义了mpc8260,才会用上此代码,所以,此处为了让Eclipse对于此代码不报错,那就随便添加一个宏判断吧,比如:

#ifdef CPU //ifeq ($(CPU),mpc8260)
......
#endif //#ifdef CPU //ifeq ($(CPU),mpc8260)

而把所有的代码,都变成#ifdef中内容了,

而由于Eclipse无法判断宏(CPU)是否被定义,所以就不会再去判断其中的内容,也就不会报错了:

for c file add ifdef

此处,当真正的定义了CPU,且其值是mpc8260,则对于文件:

mem_to_mem_idma2intr.c

也是可以被正常编译了,所以之前加的ifdef也不会影响到文件的编译的。

 

【总结】

此处,Eclipse对于C代码报错:

Type ‘immap_t’ could not be resolved

其根本原因是:

此处的c文件mem_to_mem_idma2intr.c中包含了此处定义,那是因为

在makefile中,都通过宏去判断了,当:

ifeq ($(CPU),mpc8260)

时,才会编译此文件。

而Eclipse无法识别makefile中的这种判断,导致始终会去解析此文件,而找不到对应头文件,而报错。

所以,此处为了去掉此Eclipse的"误报",直接去加了个

#ifdef CPU //ifeq ($(CPU),mpc8260)
......
#endif //#ifdef CPU //ifeq ($(CPU),mpc8260)

而暂时规避了此问题。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量