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)