gcc工具链要用一致的工具链才行,比如在180上执行的程序 直接用gcc就可以了,
单板上的话,要用/usr/KIDE/host/ide/tools_chain/arm/armeb_eabi_gcc4.8.2_glibc2.18.0_be8/bin/armeb-unknown-linux-gnueabi-目录下的gcc工具
clean:
rm 中间文件
.PHONY:clean //假的目标,就是为了避免Makefile里面的clean和Makefile之外有重名的clean;
自动化变量:
1、$@ 表示一个规则中的目标。当我们的一个规则有多个目标,$@所指的是其中任何造成命名被运行的目标
2、$^ 表示规则中所有的先决条件
3、$< 表示规则中第一个先决条件
其中,$在Makefile中有特殊的含义。因此如果要采用@echo 输出$ ,则必须用两个连着的$。还有,$@对于shell
也有特殊的意思,我们需要在$$@之前在加一个脱字符“\”,即@echo "\$$@= $@"
.PHONY:clean
CC=gcc
RM=rm
EXE=simple.exe
OBJS=main.o foo.o
simple:$(OBJS)
$(CC) -o $(EXE) $(OBJS)
main.o:main.c
$(CC) -o $@ -c $^
foo.o:foo.c
$(CC) -o foo.o -c foo.c
//更改成$(CC) -o $@ -c $^ $@指的是规则中的目标foo.o,$^ 指的是规则中的先决条件foo.c
clean:
$(RM) $(EXE) $(OBJS)
4种赋值操作
= 是最基本的赋值
:= 是覆盖之前的值 make只进行一次扫描和替换。
?= 是如果没有被赋值过就赋予等号后面的值 如果已经定义了就不在改变其值
+= 是添加等号后面的值
函数:
$(wildcard *.c) wildcard 是通配符函数,找到我们所需的函数,就是找到所有*.c函数。
$(addprefix prefix,names.....) 用来给字符串中每个字串前加上一个前缀,注意是每个字串
$(addsufix sufix,names.....) 增加后缀
$(patsubst pattern,replacement,text) 替换字符串。
mixed=foo.c bar.c main.o
objects:=$(patsubst %.c,%.o,$(mixed)) 这样就把mixed中的.c都换成.o文件了。
$(basename name ) 取前缀函数,
gcc -MM 是列出依赖文件; 这样可以看出源程序所包含的头文件
sed工具 字符串处理工具。 gcc -MM foo.c | sed's,\(.*\)\.o[:]*,objs/\1.o:/g'