gmake从多个目录中获取目标文件列表

6 makefile gnu-make

我不知道很多makefile的东西,我一直在倾向于根据需要学习位.

我的makefile最大的失败是我手动列出了所有文件,而这不是一个问题,我当前的项目变得笨拙.我有4个目录,每个目录都有源文件.

如何在不必手动列出的情况下获取所有目标文件列表.

这不起作用,但它显示了我一直在努力做的事情.

VPATH = Lib GameCode Moot/Moot Moot/Impl

OBJS = $(subst .cpp, .o, $(VPATH))

foobar: $(OBJS)
    g++ -o $@ $^

%.o: %.cpp
    g++ -c $< -o $@ -I Moot 

clean:
    rm main.o lib.o foo.o foobar
Run Code Online (Sandbox Code Playgroud)

P S*_*ved 5

就个人而言,我手动列出所有文件时从未遇到任何问题.与添加有用内容相比,将文件列入makefile所需的时间可以忽略不计.

要获取来自不同目录的所有文件,可以建议使用wildcard函数.因此,my_sources:=$(wildcard *.cpp dir1/*.cpp)将使变量包含与通配符表达式匹配的源文件.

但是,我觉得find通过shell 使用通常的Linux 命令不太方便:

# Find all sources
my_sources:=$(shell find -iname '*.cpp')
# Make targets out of them
OBJS=$(my_sources:%.cpp=%.o)
Run Code Online (Sandbox Code Playgroud)

Find比Make的内置功能更强大wildcard.您可能还希望使用其他shell功能(例如管道)来过滤输出find(如果Make的filter-out功能不够).或类似的东西,以避免过多的变量:

OBJS:=$(shell find -iname '*.cpp' | sed 's/\.cpp$/.o/')
Run Code Online (Sandbox Code Playgroud)

你说出来的名字!