gpt4 book ai didi

c++ - 在 makefile 中,如何对变量中的每个文件名执行命令?

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:04 27 4
gpt4 key购买 nike

我知道我做错了,但我不知道如何组织这个 makefile。我定义了我的 util 源文件,并使用一些函数在这里定义了它们的 .o 文件:

UTIL_SRC = utils/src/foo.cpp utils/src/bar.cpp utils/src/baz.cpp

UTIL_OBJS = $(patsubst utils/src/%.cpp,utils/obj/%.o,$(UTIL_SRC))

这是我使用这些文件的目标:

lib : lib/libutils.a

lib/libutils.a : $(UTIL_OBJS)
rm -f lib/libutils.a
ar -c -q lib/libutils.a $(UTIL_OBJS)

然后,当我找到编译这些婴儿的规则时,我希望只有一个命令可以遍历每个 UTIL_OBJS 文件和每个 UTIL_SRC 文件。相反,我诉诸了这种怪诞的做法,这违背了将它们存储在变量中的目的。

$(UTIL_OBJS) : $(UTIL_SRC)
g++ $(UTIL_FLAGS) utils/src/foo.cpp -o utils/obj/foo.o
g++ $(UTIL_FLAGS) utils/src/bar.cpp -o utils/obj/bar.o
g++ $(UTIL_FLAGS) utils/src/baz.cpp -o utils/obj/baz.o

我可以将其浓缩为一行吗?如何?谢谢,伟大的!

最佳答案

使用隐式规则通常更容易。有很多预定义的,您只需要在其中指定变量。

CXX=g++
CXXFLAGS=$(UTIL_FLAGS)

然后你需要定义一个可执行文件,像这样

myutil: $(UTIL_OBJS)

由于您没有将对象存储在同一目录中,因此您还需要指定一个新的隐式规则(否则,我们现在就完成了)。

utils/obj/%.o: utils/obj/%.cpp

% 是一个模式匹配,它会在左右两边匹配相同的文本,所以这个规则将使 foo.o 脱离 foo.cpp。尝试在没有命令的情况下是否可以工作(它可能是从另一个规则中获取的,我不确定),否则就让它说:

utils/obj/%.o: utils/obj/%.cpp
$(CXX) $(CXXFLAGS) -o $@ $^

$@ 是规则的目标(例如 foo.o),$^ 是右侧的所有文件。我是凭空写下这篇文章的,没有可能对其进行测试,所以请告诉我结果如何……:)

为了让它更优雅,你可以包含一个依赖文件

include .depend

如果您正在运行 GNU make,如果找不到它,它会尝试创建 .depend 文件(对于旧式 make,您需要先自己创建它,尽管它可能只是一个虚拟文件,如果你想通过 makefile 管理它)

.depend: $(UTIL_SRC)
$(CXX) -MM -o $@ $^

依赖文件将包含每个 .cpp 文件的行,告诉 make 它需要哪些头文件,这将允许 make 在您更改某些内容时重新编译必要的文件。但这对您最初的问题没有帮助,只是认为它可能会派上用场。

编辑:
作为对您编辑的回应。您也可以删除用于创建 .a 文件的命令,该命令也已作为隐式规则提供。虽然不确定它到底是如何工作的,但还没有使用太多。我知道 make 在处理 .a(rchive?) 文件时有很多问题。

关于c++ - 在 makefile 中,如何对变量中的每个文件名执行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1576409/

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