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

Makefile 如何在项目文件夹上移动.o?,makefile,Makefile,我编写这个Makefile是为了将项目的所有.o移动到主文件夹中的“obj”目录中 名录 生成文件 如何使其工作?这一行$OBJS_DIR)/%.o:$(SRCS)设置与$OBJS_DIR)/%匹配的每个文件的先决条件。o到$(SRCS)中的所有文件,这些文件甚至都不符合您的要求。(这也是一个打字错误。您缺少开头的() 您不能为您在此处尝试执行的操作编写一条规则。您需要三条模式规则(或者一条带有vpath/vpath设置) $(notdir)仅从源文件中获取文件名 $(patsubst)而不是

我编写这个Makefile是为了将项目的所有.o移动到主文件夹中的“obj”目录中

名录 生成文件 如何使其工作?

这一行
$OBJS_DIR)/%.o:$(SRCS)
设置与
$OBJS_DIR)/%匹配的每个文件的先决条件。o
$(SRCS)
中的所有文件,这些文件甚至都不符合您的要求。(这也是一个打字错误。您缺少开头的

您不能为您在此处尝试执行的操作编写一条规则。您需要三条模式规则(或者一条带有
vpath
/
vpath
设置)

  • $(notdir)
    仅从源文件中获取文件名
  • $(patsubst)
    而不是
    $(subst)
    只是为了正确(subst会将
    Bar.cpp.cpp
    文件修改为
    Bar.o.o
  • $(addprefix)
    $(OBJS_DIR)
    前缀添加到裸对象文件名

什么实际不起作用??对象文件没有移动到“obj”目录中您的
$(OBJS)
仍然引用源目录,而不是
$(OBJS_DIR)
OBJS=$(subst.cpp,.o,$(SRCS))
。您需要在它们前面加上
$(OBJS DIR)
。您在OBJS的末尾忘了一个'),谢谢您的回答!在浏览器窗口中编写代码的危险。谢谢
.:
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)
$(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=$(addprefix $(OBJS_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SRCS))))