gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:14 25 4
gpt4 key购买 nike

我已经为我正在处理的项目创建了一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com