我编写了这个Makefile来将项目中的所有.o移动到目录' obj'在主文件夹中。
.:
actor/ lib/ Controller.cpp Controller.h Controller.o doc.txt main.cpp main.o Makefile uno VRP*
./actor:
Customer.cpp Customer.h Customer.o Depot.cpp Depot.h Depot.o Route.cpp Route.h Route.o Vehicle.cpp Vehicle.h Vehicle.o
./lib:
Search.cpp Search.h Search.o Utils.cpp Utils.h Utils.o VRP.cpp VRP.h VRP.o
CXX=g++
RM=rm -rf
BIN_NAME=VRP
CPPFLAGS=-s -O2 -std=gnu++11 -Wall
SRCS=$(wildcard *.cpp actor/*.cpp lib/*.cpp)
OBJS=$(subst .cpp,.o,$(SRCS))
all: $(OBJS_DIR) $(BIN_NAME)
$(OBJS_DIR):
mkdir $(OBJS_DIR)
$OBJS_DIR)/%.o : $(SRCS)
$(CXX) $(CPPFLAGS) -c $< -o $@
$(BIN_NAME) : $(OBJS)
$(CXX) -o $@ $^
debug:
$(CXX) -g $(CPPFLAGS) -o $(BIN_NAME) $(OBJS)
.PHONY : all clean
clean:
$(RM) $(OBJS) $(OBJS_DIR)
dist-clean: clean
$(RM) $(BIN_NAME)
我怎样才能使它有效?
答案 0 :(得分:1)
此行$OBJS_DIR)/%.o : $(SRCS)
设置每个文件的先决条件,其中$OBJS_DIR)/%.o
与所有 $(SRCS)
中的文件不匹配接近你想要的。 (这也是一个错字。你错过了开场(
)。
您不能为此处要执行的操作编写单个规则,您需要三个模式规则(或者设置为vpath
/ VPATH
的规则)。
$(OBJS_DIR)/%.o: %.cpp
$(CXX) $(CPPFLAGS) -c $< -o $@
$(OBJS_DIR)/%.o: actor/%.cpp
$(CXX) $(CPPFLAGS) -c $< -o $@
$(OBJS_DIR)/%.o: lib/%.cpp
$(CXX) $(CPPFLAGS) -c $< -o $@
据说,由于$(OBJS_DIR)/%.o
的值为$(OBJS)
,因此您实际上没有任何与Controller.o ... actor/Customer.o ... lib/Search.o
匹配的目标。要解决此问题,您还需要:
OBJS=$(addprefix $(OBJS_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRCS))))
$(notdir)
只从源文件中获取文件名。$(patsubst)
代替$(subst)
只是为了正确性(subst会将Bar.cpp.cpp
文件修改为Bar.o.o
)。$(addprefix)
将$(OBJS_DIR)
前缀添加到裸目标文件名。