[关闭]
@cyysu 2017-10-18T08:42:06.000000Z 字数 2428 阅读 1059

Makefile-基础篇(一)

  • 时间:2017年10月10日
  • 作者:Kali
  • 邮箱:cyysu.github.io@gmail.com
  • 版本:3.0
  • 描述:主要介绍Makefile基础知识

Makefile系列教程


基础知识

  1. Makefile中,最重要的三个概念是:
  2. > 目标(target : 指的是要干什么,运行make之后生成什么
  3. > 依赖(dependency : 指的是目标所依赖的其他目标
  4. > 命令(command : 指的是make如何生成目标
  5. 下面就让我们看一下Makefile的规则
  6. target ... : prerequisites ...
  7. command
  8. ...
  9. ...
  10. # 我们举一些栗子来说明上面的格式
  11. mj@DZ:~/桌面/makefile/my$ ls
  12. Makefile
  13. mj@DZ:~/桌面/makefile/my$ cat Makefile
  14. all:
  15. echo "Hello Makefile"
  16. mj@DZ:~/桌面/makefile/my$ make
  17. echo "Hello Makefile"
  18. Hello Makefile
  19. # 我们可以看到我们输入了我们填写的内容,下面我们继续修改我们的Makefile
  20. mj@DZ:~/桌面/makefile/my$ cat Makefile
  21. all:
  22. echo "Hello Makefile"
  23. test:
  24. echo "we can learn makefile!"
  25. mj@DZ:~/桌面/makefile/my$ make
  26. echo "Hello Makefile"
  27. Hello Makefile
  28. mj@DZ:~/桌面/makefile/my$
  29. # 我们明明增加了一个test目标,为什么只生成了all目标,而没有生成test目标,这个时什么原因呢?
  30. # 这个就是Makefile的一个知识点了,它虽然允许你定义多个目标,但是它还没有智能到生成全部目标,默认时执行第一个目标,那么我们怎么同时生成多个目标呢?请看下面栗子。
  31. mj@DZ:~/桌面/makefile/my$ cat Makefile
  32. all: test
  33. echo "Hello Makefile"
  34. test:
  35. echo "we can learn makefile!"
  36. mj@DZ:~/桌面/makefile/my$ make
  37. echo "we can learn makefile!"
  38. we can learn makefile!
  39. echo "Hello Makefile"
  40. Hello Makefile
  41. # 这样我们就可以生成多个目标了,解释一下上面的栗子,我们首先定义了一个all目标,这个all目标依赖于test,所以在生成all目标前首先会构建test目标,所以就看到了先打印test目标的内容,我们可以发现Makefile同时回显了我们的命令,这个怎么去掉呢?我们只要在我们的命令前面加上@就可以解决这个问题。
  42. mj@DZ:~/桌面/makefile/my$ cat Makefile
  43. all: test
  44. @echo "Hello Makefile"
  45. test:
  46. @echo "we can learn makefile!"
  47. mj@DZ:~/桌面/makefile/my$ make
  48. we can learn makefile!
  49. Hello Makefile
  50. # 如果我们想执行某一个目标时我们应该怎么做呢?只需要在make后面跟上目标的名字即可
  51. mj@DZ:~/桌面/makefile/my$ cat Makefile
  52. all: test
  53. @echo "Hello Makefile"
  54. test:
  55. @echo "we can learn makefile!"
  56. clean:
  57. @echo "clean goal"
  58. mj@DZ:~/桌面/makefile/my$ make clean
  59. clean goal

基础实战

  1. # test.c
  2. #include <stdio.h>
  3. void foo()
  4. {
  5. printf("foo() function test makefile\n");
  6. }
  7. # main.c
  8. #include <stdio.h>
  9. extern void foo();
  10. int main()
  11. {
  12. foo();
  13. return 0;
  14. }
  15. # Makefile
  16. all: main.o foo.o
  17. gcc -o main main.o foo.o
  18. main.o: main.c
  19. gcc -o main.o -c main.c
  20. foo.o: test.c
  21. gcc -o foo.o -c test.c
  22. clean:
  23. rm -rf main main.o foo.o
  24. # 执行效果
  25. mj@DZ:~/桌面/makefile/my$ ls
  26. main.c Makefile test.c
  27. mj@DZ:~/桌面/makefile/my$ make
  28. gcc -o main.o -c main.c
  29. gcc -o foo.o -c test.c
  30. gcc -o main main.o foo.o
  31. mj@DZ:~/桌面/makefile/my$ ls
  32. foo.o main main.c main.o Makefile test.c
  33. mj@DZ:~/桌面/makefile/my$ ./main
  34. foo() function test makefile
  35. # 到现在为止,你可以写多个文件之间的依赖了,写好Makefile可以提高编译速度,可以发现我们上面的Makefile中依赖关系中有太多的重复了,下面我们简化一下我们的makefile
  36. mj@DZ:~/桌面/makefile/my$ cat Makefile
  37. CC = gcc
  38. RM = rm -rf
  39. EXE = main
  40. objs = main.o foo.o
  41. $(EXE): $(objs)
  42. $(CC) -o $@ $^
  43. foo.o: test.c
  44. $(CC) -o $@ -c $<
  45. clean:
  46. $(RM) $(EXE) *.o
  47. mj@DZ:~/桌面/makefile/my$ make
  48. gcc -c -o main.o main.c
  49. gcc -o foo.o -c test.c
  50. gcc -o main main.o foo.o
  51. mj@DZ:~/桌面/makefile/my$ ./main
  52. foo() function test makefile
  53. mj@DZ:~/桌面/makefile/my$

效果图

打赏

                    支付宝                                                         微信

微信与支付宝支付

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注