arm-himix200交叉编译器,Make出错

10 篇文章 0 订阅
10 篇文章 0 订阅

1. 最近又接了一个奇葩的项目需求,要求使用的是Linux 下海思himix200 平台,经过反复安装了终于把交叉编译器安装好了。

2. 然后编译使用MakeFile make 一下,发现出了下面问题,与编译器的一个源文件冲突了。

radio@ubuntu:/mnt/hgfs/Linux/m319-himix200/code/lib$ make
arm-himix200-linux-gcc -fPIC *.c -o M319Demo -I/usr/include/ -Im -lrt
In file included from /usr/include/features.h:367:0,
                 from /usr/include/stdio.h:27,
                 from ErrorCode.h:4,
                 from ErrorCode.c:1:
/opt/hisi-linux/x86-arm/arm-himix200-linux/target/usr/include/sys/cdefs.h:481:49: error: missing binary operator before token "("
 #if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5)
                                                 ^
Makefile:27: recipe for target 'M319Demo' failed
make: *** [M319Demo] Error 1
radio@ubuntu:/mnt/hgfs/Linux/m319-himix200/code/lib$ 

明明交叉编译工具明明是安装好的  gcc 也是是安装好的,使用使用Linux gcc 是可以编译成功的,但是,使用arm-himix200-linu-gcc 就一直报错。

反复查看我的Makefile 和 这个错误提示,发现其中一个地方,


LD		:= $(CROSS_COMPILE)ld
#CC		:= $(CROSS_COMPILE)gcc
CC		:= $(CROSS_COMPILE)arm-himix200-linux-gcc
CPP		:= $(CROSS_COMPILE)g++
AR		:= $(CROSS_COMPILE)ar
#STRIP	:= $(CROSS_COMPILE)arm-linux-strip
STRIP	:= $(CROSS_COMPILE)arm-himix200-linux-strip


CFLAGS += -fPIC

SOURCES = $(wildcard *.c)
DEP = $(wildcard *.h)
OBJS = $(patsubst %.c, %.o,$(SOURCES))

ICMLIB_O = ErrorCode.o ICMAPI.o serial.o SerialPort.o
ICMLIB_C = ErrorCode.c ICMAPI.c serial.c SerialPort.c

TARGET_SO = libradio_serialport_protocol.so
TARGET_TEST = M319Demo 

$(TARGET_TEST): 
	$(CC) $(CFLAGS) *.c -o M319Demo -I/usr/include/ -Im -lrt

$(TARGET_SO): $(ICMLIB_O)
	$(CC) $(CFLAGS) -shared -o $@ $(ICMLIB_O) $(LIB) 
	if [ ! -z "$(STRIP)" ]; then $(STRIP) --strip-all $@; fi;

$(ICMLIB_O): %.o: %.c $(DEP)
	$(CC) $(CFLAGS) -c $< -o $@ -I/usr/include/ -Im

clean:
	rm -f $(TARGET_SO) *~ *.swp $(OBJS) a.out *.gc* $(TARGET_TEST)

在Makefile 中,-I/usr/include  指定了路径,头文件寻找的路径,可能冲突了,而且查阅资料发现/usr/include 目录是默认目录,一般不用指定。

在gcc 中  -include和-I参数
-include 用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。

-I  (大写的i)参数是用来指定头文件目录/usr/include目录一般是不用指定的gcc知道去那里找。

但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I /myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误

-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的--cflags参数就是用来生成-I参数的 

gcc -I -L -l区别

于是,将-I/usr/include  修改成 -I.   ,make通过了。


LD		:= $(CROSS_COMPILE)ld
#CC		:= $(CROSS_COMPILE)gcc
CC		:= $(CROSS_COMPILE)arm-himix200-linux-gcc
CPP		:= $(CROSS_COMPILE)g++
AR		:= $(CROSS_COMPILE)ar
#STRIP	:= $(CROSS_COMPILE)arm-linux-strip
STRIP	:= $(CROSS_COMPILE)arm-himix200-linux-strip


CFLAGS += -fPIC

SOURCES = $(wildcard *.c)
DEP = $(wildcard *.h)
OBJS = $(patsubst %.c, %.o,$(SOURCES))

ICMLIB_O = ErrorCode.o ICMAPI.o serial.o SerialPort.o
ICMLIB_C = ErrorCode.c ICMAPI.c serial.c SerialPort.c

TARGET_SO = libradio_serialport_protocol.so
TARGET_TEST = M319Demo 

$(TARGET_TEST): 
	$(CC) $(CFLAGS) *.c -o M319Demo -I. -Im -lrt

$(TARGET_SO): $(ICMLIB_O)
	$(CC) $(CFLAGS) -shared -o $@ $(ICMLIB_O) $(LIB) 
	if [ ! -z "$(STRIP)" ]; then $(STRIP) --strip-all $@; fi;

$(ICMLIB_O): %.o: %.c $(DEP)
	$(CC) $(CFLAGS) -c $< -o $@ -I. -Im

clean:
	rm -f $(TARGET_SO) *~ *.swp $(OBJS) a.out *.gc* $(TARGET_TEST)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值