arm-himix200交叉編譯器,Make出錯

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)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章