我有一组我想编译的.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做的事情?如果是这样,怎么样?
感谢您的帮助!
答案 0 :(得分:14)
这看起来像......一些高级制作技巧:
all: $(OBJS)
define ruletemp
$(patsubst %.cpp, $(BUILD)/%.o, $(notdir $(1))): $(1)
$$(CPP) -c $$< -o $$@
endef
$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src))))
答案 1 :(得分:2)
如果$(BUILD)
不变,您可以随时执行:
$(BUILD)/%.o: %.cpp
$(CPP) -c $< -o $@