如何在项目文件夹上移动.o?

时间:2015-07-15 17:20:04

标签: makefile

我编写了这个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)

我怎样才能使它有效?

1 个答案:

答案 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)前缀添加到裸目标文件名。