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參數的
於是,將-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)