Chinaunix首页 | 论坛 | 博客
  • 博客访问: 822359
  • 博文数量: 124
  • 博客积分: 1927
  • 博客等级: 上尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-31 14:06
文章分类

全部博文(124)

文章存档

2018年(5)

2017年(2)

2016年(6)

2015年(4)

2014年(24)

2013年(7)

2012年(11)

2011年(13)

2010年(52)

我的朋友

分类: LINUX

2013-03-08 09:41:46

A.

【错误现象】

编译模块.o文件时,遇到下面的错误:

parse error before "this_object_must_be_defined_as_export_objs_in_the_Makefile"
[root@localhost led]# make led
ppc_82xx-gcc -O2 -DMODULE -D__KERNEL__ -Wall -I/home/mvl_pro/pro3_mpc82xx/linux-2.4.20_mvl31_mpc8247_zebos/include -c led.c
led.c:140: error: parse error before "this_object_must_be_defined_as_export_objs_in_the_Makefile"
led.c:140: warning: type defaults to `int' in declaration of `this_object_must_be_defined_as_export_objs_in_the_Makefile'
led.c:140: warning: data definition has no type or storage class
led.c:141: error: parse error before "this_object_must_be_defined_as_export_objs_in_the_Makefile"

【错误原因】

出现这个错误的根本原因是,使用了模块方式来编译程序,并且,可能在程序中使用了EXPORT_SYMBOL来导出某些符号,而编译的时候并没有指定这个模块是需要导出符号表的,从而导致出错。


【解决办法】

如果该模块是放到内核源代码目录中的,那么就去确认一下内核源代码目录下的MakeFile中的export-objs列表中,是否存在该模块的名字,如果没有,则需要添加进来。

如果该模块是单独编译的,并不是跟内核放到一起的,而是采用自己编写的或者独立的MakeFile进行编译,那么可以在CFLAGS中加上“-DEXPORT_SYMTAB”选项,我用的MakeFile如下:

KERNEL = /root/kernel/kernel-2.4.18
DEST = spi_bus

CFLAGS = -Wall -I$(KERNEL)/include -c -DEXPORT_SYMTAB
all: $(DEST).o
    @echo "Compile OK!"

clean:
    @rm -f *.o *~

%.o: %.c
    arm-linux-gcc $(CFLAGS) $^ -o $@

实例:

PWD     :=$(shell pwd)
WARN    :=-Wall -Wstrict-prototypes -Wno-trigraphs -Wmissing-prototypes
#INCLUDE :=-I/home/mvl_pro/pro3_mpc82xx/linux-2.4.20_mvl31/include
INCLUDE :=-I/home/mvl_pro/pro3_mpc82xx/linux-2.4.20__mvl31_mpc8247_zebos/include
TEMP    :=-isystem /lib/modules/`uname -r`/build/include
                                                                                       
CFLAGS :=-O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE} -DEXPORT_SYMTAB
CC      :=ppc_82xx-gcc
                                                                                       
OBJS    :=${patsubst %.c, %.o, ${wildcard *.c}}
led     :led.c
        ${CC} -O2 -DMODULE -D__KERNEL__ -Wall -I/home/mvl_pro/pro3_mpc82xx/linux-2.4.20_mvl31_mpc8247_zebos/include -c  -DEXPORT_SYMTAB led.c

B.

【错误现象】

执行编译动作时,遇到类似下面的错误:

unknown   register   name   `lr'   in   `asm'  
unknown   register   name   `ip'   in   `asm' 

【错误原因】

常出现在驱动程序的编译过程中。被编译文件中包含了有关硬件架构的头文件,然而,却使用了与当前硬件架构不同的编译器来编译它,会导致出现类似错误。拿我遇到的错误来说,我的内核源码配置为ARM平台的,但是MakeFile中却使用gcc来编译这个程序,肯定是有问题的。

【解决办法】

将MakeFile中的编译器修改为正确的目标平台的交叉编译器,如我应该使用arm-linux-gcc。

阅读(2026) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~