【问题标题】:Makefile header dependenciesMakefile 头文件依赖
【发布时间】:2013-03-31 02:38:26
【问题描述】:

我是使用 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 文件包含不同的标头,则它不会工作。是否可以编写一个知道每个 .c 文件包含什么的makefile,所以我不必像这样手动进入:

foo.o: foo.c something.h
    ...

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

因为这似乎会浪费很多时间。

【问题讨论】:

标签: makefile


【解决方案1】:

假设foo.c 有一行:

#include "something.h"

你想在 makefile 中有一行:

foo.o: foo.c something.h

gcc 编译器可以为您构造该行。命令

gcc -MMD -c -o foo.o foo.c

将构建包含该行的foo.o 和foo.d。 (试试看。)

因此,只需修改您的 makefile 以生成这些 *.d 文件并包含它们,您就完成了:

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

-include $(ODIR)/*.d

(可以进行进一步改进,例如指定 *.d 文件的位置。)

【讨论】:

  • 谢谢,很有帮助。
  • $(DEPS) 是否应该出现在示例的第一行?
  • @user2228139:[耸肩]我把它留在了,但我想没必要。
  • 如何在包含的 .d 文件中的规则之后运行命令?在-include... 行之后,我尝试放置一个选项卡,然后像往常一样放置一个命令,但它不起作用。
  • @AndrewFalanga:这根本不是一个愚蠢的问题。 OP 使用DEPS 构造规则中的先决条件列表,但此解决方案构造列表时不使用DEPS。所以在这个解决方案中DEPS 不需要,没有被定义,扩展到一个空列表并且什么都不做(我不应该把它留在里面,但我试图尽可能少地修改规则)。
【解决方案2】:

传统制造相当有限,并迫使您自己完成所有基本工作。如果您正确地期望构建工具能够找到依赖项并知道要链接什么,请尝试makepp。您可能根本不需要 makefile,或者只需要一个最小的类似

CFLAGS = -O3
myprog:                # just a default target to know what to build

链接部分需要您一点帮助,因为它基于源头对。如果myprog.cpp 包含a.h 和b.hpp,它将查看是否可以构建a.o 和/或b.o,如果可以,将链接它们并递归检查它们的源包含的内容。

如果你有更复杂的需求,你只需要学习更多的 make 语法。但是,如果您这样做,则没有限制。除了做 GNU make 能做的几乎所有事情,还有更多有用的事情,你甚至可以通过一些 Perl 编程来扩展你的 makefile。

【讨论】:

    【解决方案3】:

    是的,“MMD”标志将帮助您生成“.d”文件(依赖)文件。如果您在 Makefile(-include *.d) 末尾包含,然后如果您在 .h 文件中进行任何更改,则相应的 .o 文件将重建。

    以此为参考: https://github.com/saanvijay/makefile-skeleton

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      相关资源
      最近更新 更多