2015-08-31 22 views
1

我有這樣的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!" 

謝謝你們所有幫助,你是了不起的。

+0

你想要使用'gcc'的'-Mx'選項族並生成一個頭文件依賴關係列表來包含到你的makefile中。 –

+0

我試過了-MP,但它不起作用,也是-MD,我將它們添加到CFLAGS中,這是你的意思嗎? – Ghooo

+0

準確顯示您在makefile中嘗試的內容。刪除C++代碼,這與問題無關。我們可以相信你,你已經正確地包含了頭文件。 –

回答

1

問題是您的Makefile中未指定main.oclient.h的依賴關係。使用:

main.o: main.cpp client.h 
     $(CC) $(CFLAGS) main.cpp -o main.o 
+0

這會讓我的代碼非常難以維護,因爲添加任何新類都需要這樣做,是否有另一種指定方式而不更改main.o? – Ghooo

+1

@Ghooo,如果你使用gcc/g ++,查找選項'-MMD'和'-MD'。 –

+3

另請參閱[Auto-Dependency Generation](http://make.mad-scientist.net/autodep.html)。 –