@cyysu
2017-10-18T08:42:06.000000Z
字数 2428
阅读 1059
- 时间:2017年10月10日
- 作者:Kali
- 邮箱:cyysu.github.io@gmail.com
- 版本:3.0
- 描述:主要介绍Makefile基础知识
Makefile系列教程
在Makefile中,最重要的三个概念是:
> 目标(target) : 指的是要干什么,运行make之后生成什么
> 依赖(dependency) : 指的是目标所依赖的其他目标
> 命令(command) : 指的是make如何生成目标
下面就让我们看一下Makefile的规则
target ... : prerequisites ...
command
...
...
# 我们举一些栗子来说明上面的格式
mj@DZ:~/桌面/makefile/my$ ls
Makefile
mj@DZ:~/桌面/makefile/my$ cat Makefile
all:
echo "Hello Makefile"
mj@DZ:~/桌面/makefile/my$ make
echo "Hello Makefile"
Hello Makefile
# 我们可以看到我们输入了我们填写的内容,下面我们继续修改我们的Makefile
mj@DZ:~/桌面/makefile/my$ cat Makefile
all:
echo "Hello Makefile"
test:
echo "we can learn makefile!"
mj@DZ:~/桌面/makefile/my$ make
echo "Hello Makefile"
Hello Makefile
mj@DZ:~/桌面/makefile/my$
# 我们明明增加了一个test目标,为什么只生成了all目标,而没有生成test目标,这个时什么原因呢?
# 这个就是Makefile的一个知识点了,它虽然允许你定义多个目标,但是它还没有智能到生成全部目标,默认时执行第一个目标,那么我们怎么同时生成多个目标呢?请看下面栗子。
mj@DZ:~/桌面/makefile/my$ cat Makefile
all: test
echo "Hello Makefile"
test:
echo "we can learn makefile!"
mj@DZ:~/桌面/makefile/my$ make
echo "we can learn makefile!"
we can learn makefile!
echo "Hello Makefile"
Hello Makefile
# 这样我们就可以生成多个目标了,解释一下上面的栗子,我们首先定义了一个all目标,这个all目标依赖于test,所以在生成all目标前首先会构建test目标,所以就看到了先打印test目标的内容,我们可以发现Makefile同时回显了我们的命令,这个怎么去掉呢?我们只要在我们的命令前面加上@就可以解决这个问题。
mj@DZ:~/桌面/makefile/my$ cat Makefile
all: test
@echo "Hello Makefile"
test:
@echo "we can learn makefile!"
mj@DZ:~/桌面/makefile/my$ make
we can learn makefile!
Hello Makefile
# 如果我们想执行某一个目标时我们应该怎么做呢?只需要在make后面跟上目标的名字即可
mj@DZ:~/桌面/makefile/my$ cat Makefile
all: test
@echo "Hello Makefile"
test:
@echo "we can learn makefile!"
clean:
@echo "clean goal"
mj@DZ:~/桌面/makefile/my$ make clean
clean goal
# test.c
#include <stdio.h>
void foo()
{
printf("foo() function test makefile\n");
}
# main.c
#include <stdio.h>
extern void foo();
int main()
{
foo();
return 0;
}
# Makefile
all: main.o foo.o
gcc -o main main.o foo.o
main.o: main.c
gcc -o main.o -c main.c
foo.o: test.c
gcc -o foo.o -c test.c
clean:
rm -rf main main.o foo.o
# 执行效果
mj@DZ:~/桌面/makefile/my$ ls
main.c Makefile test.c
mj@DZ:~/桌面/makefile/my$ make
gcc -o main.o -c main.c
gcc -o foo.o -c test.c
gcc -o main main.o foo.o
mj@DZ:~/桌面/makefile/my$ ls
foo.o main main.c main.o Makefile test.c
mj@DZ:~/桌面/makefile/my$ ./main
foo() function test makefile
# 到现在为止,你可以写多个文件之间的依赖了,写好Makefile可以提高编译速度,可以发现我们上面的Makefile中依赖关系中有太多的重复了,下面我们简化一下我们的makefile
mj@DZ:~/桌面/makefile/my$ cat Makefile
CC = gcc
RM = rm -rf
EXE = main
objs = main.o foo.o
$(EXE): $(objs)
$(CC) -o $@ $^
foo.o: test.c
$(CC) -o $@ -c $<
clean:
$(RM) $(EXE) *.o
mj@DZ:~/桌面/makefile/my$ make
gcc -c -o main.o main.c
gcc -o foo.o -c test.c
gcc -o main main.o foo.o
mj@DZ:~/桌面/makefile/my$ ./main
foo() function test makefile
mj@DZ:~/桌面/makefile/my$
支付宝 微信