makefile的简单应用纪录(将多个文件各生成一个.o文件)

# -C dir读入指定目录下的Makefile
# -f  file读入当前目录下的file文件作为Makefile
# -i忽略所有的命令执行错误
# -I dir指定被包含的Makefile所在目录
# -n只打印要执行的命令,但不执行这些命令
# -p显示make变量数据库和隐含规则    
# -s在执行命令时不显示命令
# -w如果make在执行过程中改变目录,打印当前目录名
CC = gcc #定义CC为gcc
OBJS = main.o p1.o p2.o p3.o p4.o p5.o
OBJ = test/test
CFLAGS = -Wall -O -g 
VPATH=p1:p2:p3:p4:p5
$(OBJ):$(OBJS)
    $(CC) $^ -o $@
#上面一段可以不用写,利用了makefile的隐含规则,不过使用隐含规则的时候要源文件名和依赖中任何一个文件的名字相关联才行
main.o:main.c
    $(CC) -c $< $(CFLAGS) -o $@
#上面一段可以不用写,利用了makefile的隐含规则
p1/p1.o:p1.c
    $(CC) -c $< $(CFLAGS) -o $@

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

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

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

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

.PHONY:clean
clean:
    @find ./ -name "*.o" -type f -print -exec rm {} \;;rm main
#加一个@表示不用打印这一段命令

注意:如果上面的p1/p1.o    p2/p2.o等写成p1.o   p2.o的话生成的.o文件是放在当前文件夹的,所以如何命令就决定了.o文件的输出路径

下面make之前的文件目录路:

下面是make之后文件的目录情况:

 

 当然,也可以通过makefile的隐含规则来做,代码如下:
OBJS = main.o p1.o p2.o p3.o p4.o p5.o
OBJ = test/test

VPATH=p1:p2:p3:p4:p5   //p1,p2,p3,p4,p5都为文件名,指明去这些文件夹找.o文件
$(OBJ):$(OBJS)
 
.PHONY:clean
clean:
    @find ./ -name "*.o" -type f -print -exec rm {} \;;rm main

 

可以使用以下命令将生成的 .d 文件移动到另一个目录: ```makefile # 定义生成文件的存放目录 OBJ_DIR := obj DEP_DIR := dep # 使用VPATH指定源代码目录 VPATH := src # 源文件列表 SRC := $(wildcard $(VPATH)/*.c) # 根据源文件生成目标文件列表 OBJ := $(patsubst %.c,$(OBJ_DIR)/%.o,$(notdir $(SRC))) DEP := $(patsubst %.c,$(DEP_DIR)/%.d,$(notdir $(SRC))) # 生成依赖关系文件 $(DEP_DIR)/%.d : %.c @set -e; rm -f $@; \ $(CC) -MM $(CFLAGS) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,$(OBJ_DIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ # 生成目标文件 $(OBJ_DIR)/%.o : %.c $(CC) $(CFLAGS) -c $< -o $@ # 让make命令不生成.d文件 MAKEFLAGS += --no-print-directory .SUFFIXES: .SUFFIXES: .c .o # 默认执行规则 all : | $(OBJ_DIR) $(DEP_DIR) $(OBJ) # 创建目标文件目录 $(OBJ_DIR) : mkdir -p $(OBJ_DIR) # 创建依赖关系文件目录 $(DEP_DIR) : mkdir -p $(DEP_DIR) # 引入依赖关系规则 include $(DEP) # 定义清理规则 clean : @rm -rf $(OBJ_DIR) $(DEP_DIR) # 下面是具体的执行命令 # 将生成的.d和.o文件移动到其他目录 move : all mkdir -p other_dir mv $(DEP_DIR)/*.d other_dir mv $(OBJ_DIR)/*.o other_dir ``` 在上面的 makefile 文件,通过定义目标文件目录 OBJ_DIR 和依赖关系文件目录 DEP_DIR 来指定生成文件的存放目录。同时,在编写依赖关系规则时,使用 sed 命令将 $*.o 和 $@ 分别替换为 $(OBJ_DIR)/$*.o 和 $@,这样生成的依赖关系文件的依赖关系就指向了新的存放目录。 最后,在执行 `make move` 命令时,会生成所有的目标文件和依赖文件,并将它们移动到指定目录 other_dir
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值