2015-09-28 40 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

非常感謝!它現在工作正常! –