Makefile 从源列表生成文件自动生成目标

Makefile 从源列表生成文件自动生成目标,makefile,Makefile,我有这个目录结构 app/ src include lib/ src maincode/ main.cc Makefile 我想从makefile中的源列表生成自动目标。所以我不必为每个文件编写规则 范例 source=\ ../src/a.cpp ../src/ab.cpp ../lib/src/b.cpp 我想把规则写成 %.o:%.cpp 这样我就不必为每

我有这个目录结构

app/
   src
   include
   lib/
       src
   maincode/
           main.cc
           Makefile
我想从makefile中的源列表生成自动目标。所以我不必为每个文件编写规则

范例

source=\
        ../src/a.cpp
        ../src/ab.cpp
        ../lib/src/b.cpp
我想把规则写成

%.o:%.cpp
这样我就不必为每个文件重复规则。
如何实现这一点?

编辑:find命令应该在shell变量中

如果您使用的是Linux,我认为您可以使用:

SOURCES=$(shell find . -name *.cpp)
OBJECTS=$(SOURCES:%.cpp=%.o)

%.o: %.cpp
    <command to compile>
SOURCES=$(shell find.-name*.cpp)
对象=$(源:%.cpp=%.o)
%.o:%.cpp

我喜欢萨加尔的答案,尽管我花了一点时间才弄清楚我想要什么额外的规则来创建对象:

    SOURCES=$(shell find . -name *.cpp)
    OBJECTS=$(SOURCES:%.cpp=%.o)

    all: $(OBJECTS)

    %.o: %.cpp
         <command to compile dependencies $< into target $@ >  $< -o  $@ 
SOURCES=$(shell find.-name*.cpp)
对象=$(源:%.cpp=%.o)
全部:$(对象)
%.o:%.cpp
$<-o$@
CPP=g++
CPPFLAGS=-Wall-pedantic-O2-g-c
来源:=${wildcard*.cpp}
对象:=${SOURCES:.cpp=.o}
.骗子:都是干净的
.后缀:.cpp.o
全部:主要
main:$(对象)
.cpp.o:
$(CPP)$(CPPFLAGS)$<-o$@
清洁:
-rm-fv*.o

有关更多信息,请参见

我正在使用此类型SOURCEFILE=\$(SRC\u DIR)/vinit.cc\$(SRC\u DIR)/vout.cc\OBJECTS=$(SOURCEFILE:%.cc=%.o),但它无法正常工作。我没有收到任何错误。但是目标没有被调用%.o:%.cc@echo“here”它没有被调用Convention说这里的
CPP
的所有实例都应该替换为
CXX
。这是因为在一个MaFo文件中,<代码> CPP < /C> >通常意味着代码> C>代码>代码> P<代码> Re>代码> P<代码> RooSor,而不是C++。代码> CXX/CODE >被用来表示C++。
cppfagles
中显示的标志不是针对预处理器,而是针对编译器本身。当然,你怎么称呼你的变量并不重要——你可以称它们为
BERT
ERNIE
——但只有当人们遵循它们时,约定才有用!
CPP        = g++
CPPFLAGS   = -Wall -pedantic -O2 -g -c

SOURCES    := ${wildcard *.cpp}
OBJECTS    := ${SOURCES:.cpp=.o}

.PHONY:    all clean

.SUFFIXES: .cpp .o

all:       main

main:      $(OBJECTS)

.cpp.o:
    $(CPP) $(CPPFLAGS) $< -o $@

clean:
    -rm -fv *.o