gpt4 book ai didi

没有 GNU-make 模式的 Makefile 动态规则

转载 作者:行者123 更新时间:2023-12-02 22:11:55 25 4
gpt4 key购买 nike

我有一组要编译的 .cpp 文件。这些 .cpp 文件位于分层目录结构中。我希望相应的 .o 文件全部位于一个构建文件夹中。

以下是我如何让 GNU make 枚举文件:

SRCS = \
$(wildcard $(CODE)/**/*.cpp) \
$(wildcard $(CODE)/AlgebraLibraries/**/*.cpp) \
$(wildcard $(CODE)/Calculator/Environments/**/*.cpp)

BARE_SRCS = $(notdir $(SRCS))
BARE_OBJS = $(BARE_SRCS:.cpp=.o)
OBJS = $(addprefix $(BUILD)/, $(BARE_OBJS))

完成此操作后,我不知道如何创建从 .cpp 文件创建 .o 文件的规则。直观上,我想做的是以下伪代码:

for i=0, N do  # <-- a for-loop!
$(OBJS)[i]: $(SRCS)[i] # <-- the rule!
$(CPP) -c $(SRCS)[i] -o $(OBJS)[i] # <-- the recipe
end

当然,这不是有效的 GNU make 代码,但我相信您明白我在这里想要做什么。以下内容将不起作用。

%.o: %.cpp
$(CPP) -c $< -o $@

这不起作用,因为假设 .o 文件与 .cpp 文件一起存在,GNU make 会匹配 % 符号。

所有这一切的替代方案(我知道它会起作用,但会非常乏味)是手动将所有规则枚举为显式规则。必须有更好的方法!

我一直在研究 GNU make 生成规则的能力,但如果没有内置逻辑,似乎无法做到这一点。如果我可以利用一些流程控制语句来生成我想要制定的规则,那就太好了。这对 GNU-make 的要求是否太高了?

无论如何,有没有办法做我想要用 GNU make 做的事情?如果是这样,怎么办?

最佳答案

这看起来像是一项工作......几个高级制作技巧:

all: $(OBJS)

define ruletemp
$(patsubst %.cpp, $(BUILD)/%.o, $(notdir $(1))): $(1)
$$(CPP) -c $$< -o $$@
endef

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src))))

关于没有 GNU-make 模式的 Makefile 动态规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15167766/

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