繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM