为什么这个makefile总是重新编译?

时间:2015-09-28 13:43:42

标签: c++ makefile

我为我正在处理的项目完成了一个makefile,而且我的代码总是被重新编译,我不知道为什么......我已经尝试添加了。 PHONY对所有目标但没有工作。这是makefile:

TARGET  = csv2sqlite

CXX     = g++
CXXFLAGS    = -std=c++11 -Wall -I $(INCDIR) -fdiagnostics-color=always -D_DEBUG

OBJECTS = csv.o main.o

BINDIR  = bin
OBJDIR  = obj
INCDIR  = inc
SRCDIR  = src

.PHONY:default

default: $(OBJECTS) $(TARGET)

%.o: $(SRCDIR)/%.cpp
    @echo "Compiling dependecies..."
    $(CXX) $(CXXFLAGS) -c  $< -o $(OBJDIR)/$@
    @echo "Done compiling $@"

$(TARGET): $(addprefix $(OBJDIR)/, $(OBJECTS))
    @echo "Linking $@ file..."
    $(CXX) $(CXXFLAGS) $^ -o $(BINDIR)/$@
    @echo "Linking $@ file..."

run:
    bin/$(TARGET)

clean:
    rm -f obj/* bin/$(TARGET)

目录树是:

project
├── inc
│   └── csv.hpp
├── src
│   ├── csv.cpp
│   └── main.cpp
├── obj
│   ├── csv.o
│   └── main.o
├── bin
│   └── csv2sqlite
└── makefile

如果你想看到它,这是完整的project。另外,我可以做些什么改进?

谢谢!

1 个答案:

答案 0 :(得分:7)

下面:

%.o: $(SRCDIR)/%.cpp
    ...
    $(CXX) $(CXXFLAGS) -c  $< -o $(OBJDIR)/$@
    @echo "Done compiling $@"

不,你不是。您没有构建foo.o,而是构建了obj/foo.o,因此下次您告诉Make构建foo.o时,它会看到foo.o不存在并尝试重建它 - 根据这条规则,它没有做它声称要做的事情。同样地:

$(TARGET): $(addprefix $(OBJDIR)/, $(OBJECTS))
    @echo "Linking $@ file..."
    $(CXX) $(CXXFLAGS) $^ -o $(BINDIR)/$@
    @echo "Linking $@ file..."

这不会构建$(TARGET),而是构建$(BINDIR)/$(TARGET),因此Make会在每次告知构建$(TARGET)时运行此规则。

修复很简单:

OBJECTS = $(addprefix $(OBJDIR)/, csv.o main.o)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
    ...
    $(CXX) $(CXXFLAGS) -c  $< -o $@
    @echo "Done compiling $@"

TARGET  = $(BINDIR)/csv2sqlite

$(TARGET): $(OBJECTS)
    @echo "Linking $@ file..."
    $(CXX) $(CXXFLAGS) $^ -o $@
    @echo "Linking $@ file..."