[英]Makefile doesn't rebuild objects on header modification
我已经制作了一个Makefile来编译我的C程序,但是当我更改其中一个标头时,它不是在构建对象。
我的MakeFile:
CC=gcc
CFLAGS=-O3 -Wall
LDFLAGS=-I/usr/include/mysql -L/usr/lib/x86_64-linux-gnu -lmysqlclient
SOURCES=$(wildcard *.c)
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=bin/beta_parser
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)
%.o:%.c types.h cstes.h headers.h mysql.h
$(CC) -o $@ -c $< $(CFLAGS)
.PHONY: clean mrproper
clean:
rm -rf *.o
mrproper:
rm -rf $(EXEC)
我做错了什么?
编辑:马克蒂尔的评论在一个伟大的评论。
扫描源中的依赖项不在Make的范围内(尽管还有其他工具,例如CMake会自动执行此操作)。 您需要添加一个显式规则来生成这些依赖关系,但这可以通过许多不同的方式来完成。 我有时使用以下技术:
OBJECTS = ....
-include $(OBJECTS:.o=.d)
...
$(OBJECTS): %.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
$(CC) $(CFLAGS) $(DEPFLAGS) $< > $*.d
Google的“使依赖项自动生成”功能还将向您展示其他方法。
尽管还有其他更巧妙的技巧,但您认为,
$(OBJECTS): types.h cstes.h headers.h mysql.h
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
应该足够了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.