我有這樣的Makefile:GNU做出不正確生成頭文件,如果改變
CC=g++
CFLAGS=-c -Wall
all: hello
hello: main.o client.o
$(CC) main.o client.o -o hello
client.o: client.cpp client.h
$(CC) $(CFLAGS) client.cpp -o client.o
main.o: main.cpp
$(CC) $(CFLAGS) main.cpp -o main.o
clean:
rm -rf *o hello
每當我做出改變hello.h,當我執行make client.o重建。但是,當我嘗試生成的可執行文件./hello時,更改似乎不會發生。
的變化只體現在./hello如果我添加client.h到main.o:規則一樣,
main.o: main.cpp client.h
$(CC) $(CFLAGS) main.cpp -o main.o
這將會使事情變得非常難以維持我的代碼,任何想法如何解決這個問題?
編輯: 嘗試這種變化:
main.o: main.cpp
$(CC) $(CFLAGS) -MD main.cpp -o main.o
,但沒有幫助。
UPDATE(最終版):
TARGET = hello
CC = g++
CPPFLAGS = -Wall -MP -MD
LINKER = g++ -o
LFLAGS = -Wall
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES := $(wildcard $(SRCDIR)/*.cpp)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
DEPS := $(SOURCES:$(SRCDIR)/%.cpp=$(OBJDIR)/%.d)
RM = rm -rf
DIR_GUARD = mkdir -p $(@D)
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(DIR_GUARD)
@$(LINKER) [email protected] $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o: $(SRCDIR)/%.cpp
@$(DIR_GUARD)
@$(CC) $(CPPFLAGS) -c $< -o [email protected]
@echo "Compiled "$<" successfully!"
-include $(DEPS)
.PHONEY: clean
clean:
@$(RM) $(OBJDIR)/* $(BINDIR)/*
@echo "Cleanup complete!"
謝謝你們所有幫助,你是了不起的。
你想要使用'gcc'的'-Mx'選項族並生成一個頭文件依賴關係列表來包含到你的makefile中。 –
我試過了-MP,但它不起作用,也是-MD,我將它們添加到CFLAGS中,這是你的意思嗎? – Ghooo
準確顯示您在makefile中嘗試的內容。刪除C++代碼,這與問題無關。我們可以相信你,你已經正確地包含了頭文件。 –