我们有一些 C++ 代码,我们需要在其中创建一个 make 文件。每个 .h 和 .C 对创建一个对象,然后将一些对象链接在一起形成一个可执行文件。很标准的东西。
这个非 gnu make 命令只是将所有文件构建到目录中的对象中
%.o:%.C
$(CC) $(CPFLAGS) -c $<
这样做是为每个 %.C 文件(即每个 .C 文件)构建一个相应的 .o 文件。
有人知道如何用 gmake 做到这一点吗?
干杯
标记
您展示的语法在 GNU make 用语中称为模式规则,它构成了您的解决方案的基石。您所需要的只是添加一种动态获取 .C 文件列表的方法。其他人已经展示了$(shell)
用于执行此操作的解决方案,但这是不必要的低效。我建议您改用 $(wildcard),这是一个 GNU make 内置函数,专门为此目的而设计:
SRCS = $(wildcard *.C)
OBJS = $(patsubst %.C,%.o,$(SRCS))
foo: $(OBJS)
$(CC) -o $@ $^
%.o: %.C
$(CC) $(CPFLAGS) -c $<
如果您正在寻找更简洁的东西,以下内容也可以:
foo: $(patsubst %.C,%.o,$(wildcard *.C))
这只是消除了变量并利用了 GNU make 提供了默认%.o: %.C
模式规则的事实,以及将可执行文件从一组对象链接在一起的默认规则。就个人而言,我会使用更详细的版本,因为我发现它更易于阅读和维护,但对每个人来说都是如此。
希望有帮助,
埃里克·梅尔斯基
这是一个模式规则的例子,它应该在gmake
. 对于像这样的非常简单的构建,您可以主要依赖于隐式规则。您必须在要构建的目标及其依赖项中指定的主要内容:
CXXFLAGS:=-g -O -Iincludes
LDFLAGS:=-lm
SRCS:=$(shell ls *.C) # select all .C files as source
OBJS:=$(substr .C,.o,$(SRCS) # list the corresponding object files
foo : $(OBJS)
请注意使用简单的扩展变量赋值运算符 ( :=
) 而不是递归赋值运算符 ( =
),这可以减少更复杂的构建中重新处理的数量。