gpt4 book ai didi

Makefile 头文件依赖项

转载 作者:行者123 更新时间:2023-12-04 22:05:50 26 4
gpt4 key购买 nike

我是使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com