为什么这个makefile总是重新编译
Why this makefile is always recompiling?
我已经为我正在做的一个项目做了一个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
如果你想看的话,这里是完整的项目。还有,我能做些什么改进呢?
谢谢!
此处:
%.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..."
相关文章:
- 使用 MINGW gcc 编译时,不会为 std::string 调用重载的新运算符
- 如何编译:Mac上的Synergy(2017年的新工具链)
- 如何编译和运行一个新的 C++ Actor 框架项目?
- C++编译新的警告过滤器
- 每次都构建(make)lib,只有在lib较新时才重新编译项目
- 如何创建指向派生类的新指针,该派生类在C++编译时未知
- 如何在不退出和失去断点的情况下重新加载重新编译的二进制文件
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- C++运算符新重载、编译错误
- 在新OSX上编译旧碳应用
- 代码块在尝试编译或创建新文件时出现"An assertion failed!"错误
- 在新的Visual Studio项目中包含任何Eigen 3.3.1文件将无法编译
- RCpp:如何在不重新启动R的情况下重新加载重新编译的C++代码
- 新安装的MinGW问题与编译和可执行文件
- 重新编译二进制类或派生类,以便在基类中添加新方法
- 添加新库以编译任何术语.如何编辑生成文件
- C++,如果其他新文件出现问题,使用g++进行编译可以很好地工作
- 每次添加新的源子文件夹时,Cmake都会重新编译所有内容
- 不完整类型的新内容在包装在模板中时编译
- 使用新的 Qt5 信号/插槽机制连接 QTcpSocket::error() 时编译错误