我已经为我正在进行的项目做了一个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)
Run Code Online (Sandbox Code Playgroud)
目录树是:
project
??? inc
? ??? csv.hpp
??? src
? ??? csv.cpp
? ??? main.cpp
??? obj
? ??? csv.o
? ??? main.o
??? bin
? ??? csv2sqlite
??? makefile
Run Code Online (Sandbox Code Playgroud)
如果您想看到它,这是完整的项目.另外,我能做到什么样的改进?
谢谢!
这里:
%.o: $(SRCDIR)/%.cpp
...
$(CXX) $(CXXFLAGS) -c $< -o $(OBJDIR)/$@
@echo "Done compiling $@"
Run Code Online (Sandbox Code Playgroud)
不你不是.你没有构建foo.o,你构建了obj/foo.o,所以下次你告诉Make构建时foo.o,它会看到它foo.o不存在并尝试重建它 - 使用这个规则,它没有做它声称要做的事情.同样:
$(TARGET): $(addprefix $(OBJDIR)/, $(OBJECTS))
@echo "Linking $@ file..."
$(CXX) $(CXXFLAGS) $^ -o $(BINDIR)/$@
@echo "Linking $@ file..."
Run Code Online (Sandbox Code Playgroud)
这不构建$(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..."
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |