首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用/不使用GNU-make模式的Makefile动态规则

使用/不使用GNU-make模式的Makefile动态规则
EN

Stack Overflow用户
提问于 2013-03-02 06:14:36
回答 2查看 5K关注 0票数 6

我有一组要编译的.cpp文件。这些.cpp文件采用分层目录结构。我希望所有相应的.o文件最终都放在一个构建文件夹中。

下面是我如何让GNU make枚举这些文件...

代码语言:javascript
复制
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文件的规则。直观地说,我想要做的是下面的伪代码。

代码语言:javascript
复制
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代码,但我相信您会理解我正在尝试做的事情。以下内容将不起作用。

代码语言:javascript
复制
%.o: %.cpp
    $(CPP) -c $< -o $@

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

另一种方法是手动枚举所有规则,作为显式规则。我知道这会起作用,但会非常繁琐。那是智障!一定有更好的方法。

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

在任何情况下,有没有办法做我正在尝试用GNU make做的事情?如果是这样的话,是怎么做的?

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-02 10:39:42

这份工作看起来像是...几个高级Make技巧:

代码语言:javascript
复制
all: $(OBJS)

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

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src))))
票数 15
EN

Stack Overflow用户

发布于 2015-07-24 01:37:16

如果$(BUILD)是常量,你总是可以这样做:

代码语言:javascript
复制
$(BUILD)/%.o: %.cpp
    $(CPP) -c $< -o $@
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15167766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档