分类: 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。