Makefile 头文件依赖项

标签 makefile

我是使用 make 的新手,并且一直在通过 this tutorial 学习基础知识。这是教程中的最后一个 makefile 示例:

IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =../lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


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

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

假设所有 .c 文件只包含 hellomake.h,这应该可以正常工作,但如果每个 .c 文件都包含不同的 header ,则它不起作用。是否可以编写一个知道每个 .c 文件包含的内容的 makefile,这样我就不必像下面这样手动操作:
foo.o: foo.c something.h
    ...

bar.o: bar.c somethingelse.h
    ...

因为这似乎是在浪费时间。

最佳答案

假设 foo.c 有一行:

#include "something.h"

你希望在 makefile 中有一行:
foo.o: foo.c something.h

gcc 编译器可以为您构造该行。命令
gcc -MMD -c -o foo.o foo.c

将构建包含该行的 foo.ofoo.d。 (尝试一下。)

因此,只需修改您的 makefile 以生成这些 *.d 文件并包含它们,您就完成了:
$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -MMD -c -o $@ $< $(CFLAGS)

-include $(ODIR)/*.d

(进一步的改进是可能的,比如指定 *.d 文件应该去哪里。)

关于Makefile 头文件依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725789/

相关文章:

c - 在我的 makefile 中设置我的 LD_LIBRARY_PATH 有问题

docker - make [1]:[install-domserver-l]错误1(忽略)

makefile - 为什么要在先决条件之前运行配方?

makefile - make 文件中的 -wl, --start-group 是什么意思?

c - makefile 返回缺少的分隔符

c - DESTDIR 和 PREFIX 的 make

Makefile(自动依赖生成)

linux - 使用 makefile 脚本将返回值的值增加 1

linux - 安装 ns2 时如何在我的 makefile 中设置 gcc 编译器版本?

shell - 出错(Windows): line 1: syntax error near unexpected token `,'