使用 depend将对象文件保存在相同的生成文件目录中

Save object files in same makefile directory using depend

本文关键字:文件目录 存在 depend 对象 文件 保存 使用      更新时间:2023-10-16

我有这个makefile

appname := fun
srcfiles := $(shell find .. -name "*.cpp")
headerfiles := $(shell find .. -name "*.hpp")
objects  := $(patsubst %.cpp, %.o, $(srcfiles))

all: $(srcfiles) $(appname)
$(appname): $(objects)
    $(CXX) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)
depend: .depend
.depend: $(srcfiles) $(headerfiles)
    rm -f ./.depend
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend;
clean:
    rm -f $(appname) $(objects)
dist-clean: clean
    rm -f *~ .depend
include .depend

其中makefile的父目录包含所有代码(.hpp.cpp文件)。不幸的是,.o文件保存在源代码中,而我希望它们保存在可执行文件(和makefile)的同一目录中。这与 Eclipse CDT 中的Default相同。

如何修改makefile才能做到这一点?

PS:我发现了类似的问题,比如这个问题,但他们都没有使用depend来定义$(objects)任务(它们都是'%.o%'的形式)。

当您设置 objects 变量时,您只需将完整的路径名带到.cpp文件并将后缀替换为 .o 。 因此,如果您有像my/sub/dir/foo.cpp这样的文件,那么objects将包含路径my/sub/dir/foo.o。 所以,当然当你编写规则$(appname): $(objects)时,make会尝试构建文件my/sub/dir/foo.o。 如果你希望它只构建foo.o,那么你也必须剥离路径,而不仅仅是替换后缀:

objects := $(patsubst %.cpp,%.o,$(notdir $(srcfiles)))

现在,当然,make会说它不知道如何构建foo.o,因为默认规则只知道如何从.cpp构建.o,而不是从my/sub/dir中存储的.cpp文件。

要完成这项工作,最简单的解决方案是使用 VPATH,您可以从从srcfiles获得的目录列表中构造 VPATH 的值,如下所示:

VPATH := $(sort $(dir $(srcfiles)))

您还可以考虑使用更好的依赖项生成解决方案,例如此处描述的解决方案。