我是使用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
...
因为这似乎是浪费时间。
答案 0 :(得分:13)
假设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文件的位置。)
答案 1 :(得分:0)
传统品牌相当有限,迫使你自己做所有基本的东西。如果您正确地希望构建工具能够找到依赖关系并知道要链接的内容,请尝试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。
答案 2 :(得分:0)
是的,&#34; MMD&#34; flag会帮助你生成&#34; .d&#34;文件(依赖)文件。如果在Makefile的末尾包含(-include * .d),然后在.h文件中进行任何更改,则相应的.o文件将重建。