Makefile:.h/.c文件更新,自动识别关联并重新编译

在这里插入图片描述
add.h

#ifndef _ADD_H
#define _ADD_H
//#define A 20
int add(int a,int b);

#endif //_ADD_H_

add.c

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

sub.h

#ifndef _SUB_H
#define _SUB_H
#define B 10
int sub(int a,int b);

#endif

sub.c

int sub(int a,int b)
{
        return a - b;
}

main.c

#include <stdio.h>
#include "./inc/sub.h"
#include "./inc/add.h"

int main()
{
        int a =7 ,b =3;
        printf("a + b = %d\n",add(a,b));
        printf("a - b = %d\n",sub(a,b));

        return 0;
}

Tmp目录下的Makefile

CC = gcc
TOPDIR := $(shell pwd)
INCDIR := $(TOPDIR)/inc
SRCDIR := $(TOPDIR)/src

CPPFLAGS := -I include
CFLAGS := -fno-builtin -Wall -O2

export CC TOPDIR SRCDIR CPPFLAGS CFLAGS

TARGET = main
SRCS := $(wildcard *.c)
SRCS += $(foreach dir,$(SRCDIR),$(wildcard $(dir)/*.c))
OBJS := $(patsubst %.c,%.o, $(SRCS))
OBJS_D := $(patsubst %.c,%.d,$(SRCS))

#all:$(TARGET) debug 
$(TARGET):$(OBJS)

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

.PHONY :debug
debug:
        @echo "srcs = $(SRCS),objs = $(OBJS)."  

.PHONY : clean
clean:

  rm -rf add.o sub.o main.o main.d
  make clean -C src

上面的Makefile存在关联问题:.h文件没有相关联到.o文件,所以修改.h文件后,make没有重新编译。现象如下图:
在这里插入图片描述
需要make clean清除.o文件和目标文件后,才能重新编译。
修改.h文件后,make可以直接编译:方法是通过编译器来输出.o文件所依赖的所有.h文件,生成.d文件。确定每个.o文件所依赖的.h文件。

自动产生依赖关系:
gcc 通过“-M”选项来实现此功能,使用“-M”选项 gcc 将自动找寻源文件中包含的头文件,并生成文件的依赖关系。例如,如果“main.c”只包含了头文件“defs.h”,那么在 Linxu 下执 行下面的命令:
gcc -M main.c
其输出是:
main.o : main.c defs.h
当不需要在依赖关系中考虑标准库头文件时,对于 gcc 需要使用“-MM”参数。

下面这个makefile就可以在.h文件更新的时候重新编译相应的.o文件:

CC = gcc
TOPDIR := $(shell pwd)
INCDIR := $(TOPDIR)/inc
SRCDIR := $(TOPDIR)/src

CPPFLAGS := -I include
CFLAGS := -fno-builtin -Wall -O2

export CC TOPDIR SRCDIR CPPFLAGS CFLAGS

TARGET = main
SRCS := $(wildcard *.c)
SRCS += $(foreach dir,$(SRCDIR),$(wildcard $(dir)/*.c))
OBJS := $(patsubst %.c,%.o, $(SRCS))
OBJS_D := $(patsubst %.c,%.d,$(SRCS))

#all:$(TARGET) debug 
$(TARGET):$(OBJS)

#       $(CC) $(OBJS) -o $(TARGET)
        $(CC) -o $(TARGET) $^

-include $(OBJS_D)
$(OBJS):%.o:%.c
        $(CC) $(CPPFLAGS) $(CFLAGS)  -MM -MT $@ -MF $(patsubst %.o, %.d, $@) $<
        $(CC) -c  $(CPPFLAGS)  -o $@  $(CFLAGS) $<

#       @echo "OBJS_D = $(OBJS_D)"

.PHONY :debug
debug:
        @echo "srcs = $(SRCS),objs = $(OBJS)."  

.PHONY : clean
clean:
		rm -rf add.o sub.o main.o main.d
        make clean -C src
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值