2015-09-28 144 views
2

我已经为我正在工作的项目做了一个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)/[email protected] 
    @echo "Done compiling [email protected]" 

$(TARGET): $(addprefix $(OBJDIR)/, $(OBJECTS)) 
    @echo "Linking [email protected] file..." 
    $(CXX) $(CXXFLAGS) $^ -o $(BINDIR)/[email protected] 
    @echo "Linking [email protected] 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如果你想看到它。另外,我能做些什么改进?

谢谢!

+0

您链接GitHub的项目不包括你发布的代码。 – DevSolar

回答

7

这里:

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

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

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

这不建$(TARGET),它建立$(BINDIR)/$(TARGET),所以要运行这个规则每次它告诉打造$(TARGET)时间。

修复的方法是简单的:

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

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

TARGET = $(BINDIR)/csv2sqlite 

$(TARGET): $(OBJECTS) 
    @echo "Linking [email protected] file..." 
    $(CXX) $(CXXFLAGS) $^ -o [email protected] 
    @echo "Linking [email protected] file..." 
+0

非常感谢!它现在工作正常! –