我正在尝试设置一个自动依赖生成的Makefile。我重写了这个页面http://make.paulandlesley.org/autodep.html并编写了我自己的Makefile:
编辑: 我在Beta评论后做了一些更改。 现在,所有文件和makefile都处于同一级别。 但不是更幸运。
CC = gcc
LD = gcc
RM = rm -rf
MAKEDEPEND = gcc -M $(CFLAGS) $(INCLUDE) -o $*.d $<
CFLAGS = -Wall -g
INCLUDE = -I/usr/include/CUnit
LIB = -llibcunit
SRC = lib_dac.c
SRC += main.c
OBJS = $(SRC:.c=.o)
PROG = tests
all: $(OBJS)
%.o : %.c
$(MAKEDEPEND); \
cp $*.d $*.P; \
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
rm -f $*.d
$(CC) -c $(CFLAGS) $(INCLUDE) -o $@ $<
-include $(SRCS:.c=.P)
PHONY: clean
clean:
$(RM) *.o *.exe
$(RM) *.P
但我不能让它奏效。当我触摸lib_dac.h时,依赖lib_dac.c就什么都没发生。 我错过了什么吗?
感谢您的帮助。
答案 0 :(得分:1)
MAKEDEPEND
为lib_dac.o
提供了依赖关系,而不是src/lib_dac.o
。当Make尝试构建src/lib_dac.o
时,它不知道涉及lib_doc.h
。
有几种方法可以解决此问题,但选择取决于您希望如何处理目标文件(例如lib_dac.o
)。我注意到你定义了一个BIN_PATH
,但是没有使用它;而是在src
中构建对象。这是你的意图吗?
修改:
以下是将对象文件放在bin/
中的快速修复方法。 (擅长使用文件那里来构建文件这里,但不是相反。)
OBJS = $(patsubst %.c,bin/%.o,$(SRC))
bin/%.o : %.c
...
vpath %.c src
答案 1 :(得分:0)
好的,我在makefile中发现了拼写错误。在包含中,我写了$SRCS
而不是$SRC
。该死的复制/粘贴。
现在效果很好,但目前所有文件都在同一个目录中,我真的不喜欢它。
但依赖关系生成有效,所以问题就解决了。