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

Dan*_*mos 2 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)
Run Code Online (Sandbox Code Playgroud)

目录树是:

project
??? inc
?   ??? csv.hpp
??? src
?   ??? csv.cpp
?   ??? main.cpp
??? obj
?   ??? csv.o
?   ??? main.o
??? bin
?   ??? csv2sqlite
??? makefile
Run Code Online (Sandbox Code Playgroud)

如果您想看到它,这是完整的项目.另外,我能做到什么样的改进?

谢谢!

Bet*_*eta 7

这里:

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

不你不是.你没有构建foo.o,你构建了obj/foo.o,所以下次你告诉Make构建时foo.o,它会看到它foo.o不存在并尝试重建它 - 使用这个规则,它没有做它声称要做的事情.同样:

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

这不构建$(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..."
Run Code Online (Sandbox Code Playgroud)