6

我有一组要编译的 .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 $@

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

所有这一切的替代方法,我知道它会起作用,但会非常乏味,是手动列举所有规则作为显式规则。那是迟钝!一定有更好的方法。

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

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

感谢您的帮助!

4

2 回答 2

15

这看起来像是……几个高级制作技巧的工作:

all: $(OBJS)

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

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src))))
于 2013-03-02T02:39:42.053 回答
2

如果$(BUILD)是恒定的,你总是可以这样做:

$(BUILD)/%.o: %.cpp
    $(CPP) -c $< -o $@
于 2015-07-23T17:37:16.297 回答