Skip to content

Makefile清理操作

清理操作的作用: 清除编译生成的中间.o文件和最终目标文件

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

伪目标声明:

  • .PHONY:clean

  • 声明目标为伪目标之后,Makefile将不会检查该目标是否存在或者该目标是否需要更新

clean命令中的特殊符号:

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

  • rm -f: 强制执行,比如若要删除的文件不存在使用-f不会报错

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

其它

  • make 默认执行第一个出现的目标,可通过make dest指定要执行的目标
  • make -f-f执行一个Makefile文件名称,使用make执行指定的Makefile: make -f mainmak

实例

Makefile的第5个版本:

makefile
# 默认目标  
all: main

target=main
src=$(wildcard ./*.c)
obj=$(patsubst %.c, %.o, $(src))
CC=gcc
CFLAGS=-I ./
  
$(target):$(obj)
	$(CC) $^ -o $@

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

# 定义两个伪目标 一个用来清除生成的中间.o文件,一个用来清除生成的可执行程序
.PHONY: clean rm
clean:
	$(RM) $(obj)
rm:
	$(RM) $(target)
c
#include "add.h"
#include <stdio.h>

int main(void) {
    printf("%d\n", add(10, 20));

    return 0;
}
c
#ifndef __SYSS_ADD_H__
#define __SYSS_ADD_H__

int add(int a, int b);

#endif //__SYSS_ADD_H__
c
#include "add.h"

int add(int a, int b) {
    return a + b;
}

执行make

在Makefile的第5个版本中,综合使用了变量、函数、模式规则和清理命令,是一个比较完善的版本。

不过它是把当前文件夹下所有的源文件编译成一个可执行程序,下面一个是把源文件分别编译成可执行程序的版本

makefile
CC:=gcc
SRCS := $(wildcard *.c)
BINS := $(SRCS:%.c=%)
all: $(BINS) 
%: %.c
  $(CC) $< -o $@ 
.PHONY:clean 
clean:
  rm -f $(BINS)