我不知道很多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)
就个人而言,我手动列出所有文件时从未遇到任何问题.与添加有用内容相比,将文件列入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)
你说出来的名字!