我是使用 make 的新手,并且一直在通过以下方式学习基础知识本教程 http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/。这是本教程中的最后一个 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
...
因为这看起来会浪费大量时间。
Suppose foo.c
有一行:
#include "something.h"
您希望在 makefile 中添加一行:
foo.o: foo.c something.h
gcc 编译器可以为您构造该行。命令
gcc -MMD -c -o foo.o foo.c
将建立foo.o
and foo.d
其中包含该行。 (尝试一下。)
因此,只需修改您的 makefile 以生成这些 *.d 文件并包含它们,就完成了:
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -MMD -c -o $@ $< $(CFLAGS)
-include $(ODIR)/*.d
(可以进行进一步的细化,例如指定 *.d 文件的位置。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)