制作Makefile进行项目管理

制作Makefile进行项目管理

通过使用Makefile,可以是的项目代码编译管理,节约编译项目时间,做到一次编译,终身受用。

Makefile的工作原理是:

  • 分析各个目标和依赖之间的关系。
  • 根据一览关系自底向上执行命令
  • 根据修改时间比较目标新旧,确定更新
  • 如果目标不依赖任何条件,则执行对应命令,以示更新

Makefile的基本规则是:目标、条件、命令。

通过制作各个阶段的Makefile,各个阶段之间从易到难,逐渐提升。

阶段一

    all:main.c add.c sub.c 
        gcc main.c add.c sub.c -o app

all表示执行命令后达成了all目标,也可以写成app,依赖条件是:main.c add.c sub.c,命令是:gcc main.c add.c sub.c -o app

保存之后,直接运行make命令

此版本当修改一个文件时,所有的文件都要重新编译,当项目比较大时,没有起到节约时间的作用。

阶段二

    app:main.o add.o sub.o
        gcc main.o add.o sub.o -o app

    main.o:main.c
        gcc -c main.c

    add.o:add.c
        gcc -c add.c

    sub.o:sub.c
        gcc -c sub.c

    clean:
        rm *.o
        rm app

clean : 清除编译生成的中间.o文件和最终目标文件。

由于make默认执行第一个目标,clean与前面的没有关系,所以如果要执行clean,则要使用make clean。

如果当前目录下有同名clean文件,则不执行clean对应的命令:

  • 伪目标声明:.PHONY:clean

clean命令中的特殊符号:

  • “-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”

  • “@”不显示命令本身,只显示结果。如:“@echo”clean done“”

    app:main.o add.o sub.o
        gcc main.o add.o sub.o -o app

    main.o:main.c
        gcc -c main.c

    add.o:add.c
        gcc -c add.c

    sub.o:sub.c
        gcc -c sub.c

    .PHONY:clean
    clean:
        -@rm *.o
        -@rm app

此时的Makefile文件可以做到节约时间的作用。不过,可以根据Makefile定义一些变量,使得代码通用性更强。

阶段三

    obj=main.o add.o sub.o
    app:$(obj)
        gcc $(obj) -o app

    main.o:main.c
        gcc -c main.c

    add.o:add.c
        gcc -c add.c

    sub.o:sub.c
        gcc -c sub.c

    .PHONY:clean
    clean:
        -@rm *.o
        -@rm app

@ ^表示所有的依赖,$<表示依赖中的第一个。

    obj=main.o add.o sub.o
    app:$(obj)
        gcc $(obj) -o app

    %.o:%.c
        gcc -c $^ -o $@

    .PHONY:clean
    clean:
        -@rm *.o
        -@rm app

阶段四

为了是的Makefile更加通用,使用Makefile的一些函数。

  • wildcard 查找符合条件的文件名
  • patsubst 查找替换
  1 src = $(wildcard *.c)
  2 obj = $(patsubst %.c,%.o,$(src))
  3 target = app
  4 
  5 $(target):$(obj)
  6     gcc $^ -o $@
  7                                                                       
  8 %.o:%.c
  9     gcc -c $^ -o $@
 10 
 11 clean:
 12     -@rm *.o
 13     -@rm app

阶段五

   CPPFLAGS = -Iinclude
   CFLAGS = -g -Wall
   LDFLAGS = -L../lib -lmycalc
   CC = gcc

   src = $(wildcard *.c)
   obj = $(patsubst %.c,%.o,$(src))
   target = app

  $(target):$(obj)
      $(CC) $^ $(LDFLAGS) -o $@

  %.o:%.c
      $(CC) -c $^ $(CFLAGS) $(CPPFLAGS) -o $@

  clean:
      -@rm *.o
      -@rm app 

猜你喜欢

转载自blog.csdn.net/guidao13/article/details/53956772