我已经制作了一个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)
我做错了什么?
编辑:在评论之后对Makeil的核心。
答案 0 :(得分:1)
扫描您的依赖项源代码超出了Make的范围(尽管还有其他工具,例如CMake会自动执行此操作)。您需要添加一个显式规则来生成这些依赖项,但这可以通过许多不同的方式完成。我有时会使用以下技术:
OBJECTS = ....
-include $(OBJECTS:.o=.d)
...
$(OBJECTS): %.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
$(CC) $(CFLAGS) $(DEPFLAGS) $< > $*.d
谷歌“制作自动依赖关系”会向您展示其他方法。
答案 1 :(得分:1)
虽然还有其他更优雅的技巧,在你的情况下,我认为像
$(OBJECTS): types.h cstes.h headers.h mysql.h
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
应该足够了。