Srcs   := $(wildcard *.c)
CC     := gcc
CFLAGS := -Wall -g -lpthread

# all in one
Objs   := $(patsubst %.c, %.o, $(Srcs))
Out := main
ONE: $(Out)
$(Out): $(Objs)
	$(CC) $^ -o $@
%.o: %.c
	$(CC) -c $< $(CFLAGS)

# one by one
Outs := $(patsubst %.c, %, $(Srcs))
ALL: $(Outs)
%: %.c
	$(CC) $< -o $@ $(CFLAGS)

.PHONY: clean rebuild ONE ALL
clean:
	$(RM) $(Objs) $(Out) $(Outs)
rebuild: clean $(Out)

此Makefile集成多个文件生成一个可执行程序和一个文件生成一个可执行程序两个功能,命令如下

// 多个文件生成一个可执行程序
make ONE
// 一个文件生成一个对应的可执行程序
make ALL

**注意:**仍然需要将两种不同需求的文件放在不同文件夹下(即一对一放一个文件夹,多对一开另一个文件夹)

一些额外的扩展


每次开一个新的文件夹,都需要cp Makefile到当前的工作目录,这样让人很不舒服,接下来我们要解决这个问题

我们现在只需要一个Makefile在家目录下,不用将Makefile复制到工作目录下,每次运行makefile都会运行家目录下的Makefile,使用命令如下

// -f 后面加自己的Makefile的绝对路径
make -f /home/username/Makefile ALL 

但这样还是很麻烦,因为我们每次make都需要输入一长串的路径,那么我们接下来将解决这个问题

使用如下命令修改你家目录下的 .bashrc 文件

vim /home/username/.bashrc

然后我们在文件后面加一个函数,如下

Untitled

-f 后面替换为自己的路径 保存并关闭文件,然后重新加载 .bashrc

source ~/.bashrc

然后我们就完成了!使用效果图如下

Untitled