我不知道很多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
答案 0 :(得分:5)
就个人而言,我手动列出所有文件时从未遇到任何问题。与添加有用内容相比,将文件列入makefile所需的时间可以忽略不计。
要获取不同目录中的所有文件,可以建议使用wildcard
function。因此my_sources:=$(wildcard *.cpp dir1/*.cpp)
将使变量包含与通配符表达式匹配的源文件。
但是,我觉得通过shell使用通常的Linux find
命令不太方便:
# Find all sources
my_sources:=$(shell find -iname '*.cpp')
# Make targets out of them
OBJS=$(my_sources:%.cpp=%.o)
查找比Make的内置wildcard
更强大。您可能还希望使用其他shell功能(例如管道)来过滤find
的输出(如果Make filter-out
函数不够用)。或类似的东西,以避免过多的变量:
OBJS:=$(shell find -iname '*.cpp' | sed 's/\.cpp$/.o/')
你说出来了!
答案 1 :(得分:0)
使用VPATH或vpath不适用于您的问题..它提供了查找文件的搜索路径,但您仍需要列出文件。如果您只需要编译在这些目录中找到的所有.c / .cpp文件,那么这应该可以工作:
foobar: $(shell ls Lib/*.cpp) $(shell ls GameCode/*.cpp) $(shell ls Moot/Moot/*.cpp) $(shell ls Moot/Impl/*cpp)
g++ -o $@ $^
clean:
rm foobar $(shell ls Lib/*.o) $(shell ls GameCode/*.o) $(shell ls Moot/Moot/*.o) $(shell ls Moot/Impl/*o)
不需要VPATH信息,.o替换.cpp可以替代隐式规则。另外,不是使用ls而不是find,只能在specfified目录中查找。