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