gpt4 book ai didi

c++ - 使用 depend 将目标文件保存在同一 makefile 目录中

转载 作者:行者123 更新时间:2023-11-28 05:21:15 25 4
gpt4 key购买 nike

我有这个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:我发现了类似的问题,比如 this一个,但它们都没有使用 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,因为默认规则只知道如何构建 .o .cpp,而不是来自 my/sub/dir 中的 .cpp 文件。

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

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

您还可以考虑使用更好的依赖生成解决方案,例如 the one described here .

关于c++ - 使用 depend 将目标文件保存在同一 makefile 目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41455528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com