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