如何在makefile中的变量内迭代每个文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在makefile中的变量内迭代每个文件相关的知识,希望对你有一定的参考价值。

我想为变量“CPPS”中的每个cpp文件创建* .o(在Ubuntu中)

CPPS := file1.cpp \                
        file2.cpp \
        file3.cpp \
        folder1/file4.cpp \
        folder2/file5.cpp \
        folder2/folder21/file6.cpp 

OBJS := file1.o \                
        file2.o \
        file3.o \
        file4.o \
        file5.o \
        file6.o  


test:$(OBJS)
    $(CXX)  $(FLAG) -o m $(OBJS) 

我想自动为每个cpp创建* .o。我想在Makefile的同一个文件夹中创建* .o。如果所有的cpps都与Makefile在同一个文件夹中,我们可以使用

%.o:%.cpp
    $(CXX)  $(FLAG) -c -o $@ $< $(INC)

但问题是它们位于不同的文件夹中,目前我必须编写一个脚本来为每个文件创建一个lnk。有没有办法在变量中的每个文件上进行迭代?还是有另一种方法可以做到这一点?

答案

使用不同目录中的源文件是the vpath directive的用途:

CPPS := file1.cpp ...
OBJS := file1.o ...

vpath %.cpp folder1 folder2 folder2/folder21

all: $(OBJS)

您可以从CPPS生成vpath和OBJS,而不是手动输入所有内容:

CPPS := file1.cpp ...
OBJS := $(notdir $(CPPS:.cpp=.o))

SRCDIRS := $(dir $(CPPS))
vpath %.cpp $(SRCDIRS)

all: $(OBJS)

以上是关于如何在makefile中的变量内迭代每个文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Makefile 中,如何使通配符函数适用于 VPATH 变量设置的所有路径中的文件

在循环内创建的变量在 C 中的迭代期间更改值

如何使用 makefile 生成自动头文件

makefile.am 变量在 make 命令中的目标文件之后设置一些库

Makefile笔记

在目标内设置 Makefile 变量