c++ - 为什么这个 makefile 总是在重新编译?

标签 c++ makefile

我已经为我正在处理的项目创建了一个 makefile,并且我的代码总是被重新编译,我不知道为什么......我已经尝试将 .PHONY 添加到所有目标但没有'不工作。这是生成文件:

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如果你想看的话。另外,我可以做什么样的改进?

谢谢!

最佳答案

这里:

%.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 每次被告知构建时都会运行此规则$(目标)

修复很简单:

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..."

关于c++ - 为什么这个 makefile 总是在重新编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32824615/

相关文章:

c++ - C++ lambda 表达式的生命周期是多少?

c++ - C++ 中的一个特殊的 Person 类

c++ - 在 C++11 中打印 std::bitset

postgresql - 使用 make 为 Postgresql 创建 pg_strom 扩展时出错 : “make: *** No targets specified and no makefile found. Stop.”

c - 如何使用 curses.h 为程序创建 makefile

dependencies - 需要一个可以处理丢失文件的 makefile 依赖规则

c++ - 用于谷歌云消息传递的 QNetworkAccessManager

c++ - 无法安装 R 包 "BH"

makefile - 抑制 "make: Nothing to be done for ' 目标'”

c++ - 如何根据构建选项制作生成文件