您的位置:首页 > 其它

makefile学习笔记

2014-03-26 15:12 246 查看

学习makefile笔记


一个我个人觉得非常实用的例子:
eg:在当前目录下有a.cpp and b.cpp 现在写一个makefile,将这些文件编译出对应的.o文件。

begin:
1
2 src=$(wildcard *.c)
3 dir=$(notdir $(src))
4 obj=$(patsubst %.c,%.o,$(dir) )
5
6 all: $(obj)
7         @echo src:$(src)
8         @echo dir:$(dir)
9         @echo obj:$(obj)
10         @echo "end"
11 $(obj): %.o: %.c
12         gcc -c $(CFLAGS) $< -o $@
13 clean:
14         -@rm -rf *.o


输出结果为:

gcc -c  char.c -o char.o

gcc -c  test_sizeof.c -o test_sizeof.o

gcc -c  transfer.c -o transfer.o

src:char.c test_sizeof.c transfer.c

dir:char.c test_sizeof.c transfer.c

obj: char.o test_sizeof.o transfer.o

end

#wildcard把 指定目录下的所有后缀是c的文件全部展开
a.cpp b.cpp 

#notdir把展开的文件去除掉路径信息

a.cpp b.cpp 

#patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o

#CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。
#在每条命令前加上@符号,可以隐藏makefile打印出当前命令本身
#在命令前加上一个“-”号的意思是,忽略该条命令的错误,继续执行。等同于-i i是--ignore-errors的缩写。

今天学习了makefile中的“命令包”好“目标变量”

命令包:
eg:
1 src=$(wildcard *.c)
2 dir=$(notdir $(src))
3 obj=$(patsubst %.c,%.o,$(dir) )
4
5 define two_line
6 echo "this is two_line:one"
7 echo "this is two_line:two"
8 endef
9
10 all: $(obj)
11         @echo $(src)
12         @echo $(dir)
13         @echo $(obj)
14         @echo "end"
15         @$(two_line)
16
17 $(obj): %.o: %.c
18         gcc -c $(CFLAGS) $< -o $@
19 clean:
20         rm -rf *.o


其中5~8行定义了这个命令包,two_line是这个命令包的名字,在define和endef之间的命令就是这个命令包的内容,在第15行调用了这个命令包。结果和想象的一样,不用过多解释。

目标变量:
这个特性很有用,我们设置了一个变量,这个变量只在特定的目标中起作用。

eg:
1 src=$(wildcard *.c)
2 dir=$(notdir $(src))
3 obj=$(patsubst %.c,%.o,$(dir) )
4
5 define two_line
6 echo "this is two_line:one"
7 echo "this is two_line:two"
8 endef
9
10 all: cc = gcc
11
12 all: $(obj)
13         @echo $(src)
14         @echo $(dir)
15         @echo $(obj)
16         @echo "end"
17         @$(two_line)
18
19 $(obj): %.o: %.c
20         $(cc) -c $(CFLAGS) $< -o $@
21 clean:
22         rm -rf *.o
23
24
第十行中,我们在all这个目标中定义 cc=gcc,只在这个目标规则下,$(cc) = gcc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: