如果更改了

时间:2015-08-31 17:23:34

标签: c++ makefile header-files

我有这个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中进行更改时,在执行make时会重建client.o。但是当我尝试生成的可执行文件./hello时,似乎没有发生变化。

如果我将client.h添加到main.o:规则中,那么更改只会反映在./hello上

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

但没有帮助。

更新(最终版本):

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!"

谢谢大家的帮助,你真的很棒。

1 个答案:

答案 0 :(得分:1)

问题在于client.h中未指定Makefilemain.o: main.cpp client.h $(CC) $(CFLAGS) main.cpp -o main.o 的依赖关系。使用:

URLEncoder.encode(arg:String):String