如果更改了,GNU make不能正确地构建头文件



我有这个makefile:

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, client. h中进行更改时。当我执行make时,o被重新构建。但是当我尝试结果的可执行文件。/hello时,变化似乎没有发生。

如果我将client.h添加到main,则更改仅反映在./hello上。0:像那样的规则

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) $@ $(LFLAGS) $(OBJECTS)
        @echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o: $(SRCDIR)/%.cpp
        @$(DIR_GUARD)
        @$(CC) $(CPPFLAGS) -c $< -o $@
        @echo "Compiled "$<" successfully!"
-include $(DEPS)
.PHONEY: clean
clean:
        @$(RM) $(OBJDIR)/* $(BINDIR)/*
        @echo "Cleanup complete!"

谢谢大家的帮助,你真的很了不起。

问题是main.oclient.h的依赖性没有在您的Makefile中指定。用途:

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

最新更新