自动生成目标文件列表的Makefile

3

我有这个目录结构。

app/
   src
   include
   lib/
       src
   maincode/
           main.cc
           Makefile

我希望能够在makefile中从源文件列表中生成自动目标,这样就不必为每个文件编写规则。
例如:
source=\
        ../src/a.cpp
        ../src/ab.cpp
        ../lib/src/b.cpp

我想编写类似以下的规则:
%.o:%.cpp

为了不必为每个文件重复规则,我该如何实现这一点?
3个回答

8

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

如果您使用Linux,我认为您可以使用以下命令:

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

%.o: %.cpp
    <command to compile>

我正在使用以下代码: SOURCEFILE=
$(SRC_DIR)/vinit.cc
$(SRC_DIR)/vout.cc \OBJECTS=$(SOURCEFILE:%.cc=%.o) 但它并没有正常工作。
- Vivek Goel
我没有收到任何错误信息。 但是目标没有被调用。 %.o: %.cc @echo "这里" 它没有被调用。 - Vivek Goel

3

我喜欢Sagar的回答,尽管我花了一点时间才弄清楚我想要一个额外的规则来导致对象的创建:

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

    all: $(OBJECTS)

    %.o: %.cpp
         <command to compile dependencies $< into target $@ >  $< -o  $@ 

2
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

更多信息请参见手册

,其中包含与通配符相关的内容。


3
按照惯例,这里所有的 CPP 实例都应该替换为 CXX。这是因为在 Makefile 中,CPP 通常意味着 C 预处理器(PreProcessor),而不是 C++。CXX 则表示 C++。这里显示的 CPPFLAGS 标志不是为预处理器而是为编译器本身设置的。当然,你如何命名变量并不重要,你可以称它们为 BERTERNIE,但是只有人们遵循惯例,惯例才有用! - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接