Makefile不会在标头修改时重建对象

时间:2014-10-15 12:36:52

标签: c gcc compilation makefile

我已经制作了一个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的核心。

2 个答案:

答案 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)

应该足够了。