我为我正在处理的项目完成了一个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。另外,我可以做些什么改进?
谢谢!
答案 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..."