13

我们有一些 C++ 代码,我们需要在其中创建一个 make 文件。每个 .h 和 .C 对创建一个对象,然后将一些对象链接在一起形成一个可执行文件。很标准的东西。

这个非 gnu make 命令只是将所有文件构建到目录中的对象中

%.o:%.C
    $(CC) $(CPFLAGS)  -c  $<

这样做是为每个 %.C 文件(即每个 .C 文件)构建一个相应的 .o 文件。

有人知道如何用 gmake 做到这一点吗?

干杯

标记

4

2 回答 2

26

您展示的语法在 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模式规则的事实,以及将可执行文件从一组对象链接在一起的默认规则。就个人而言,我会使用更详细的版本,因为我发现它更易于阅读和维护,但对每个人来说都是如此。

希望有帮助,

埃里克·梅尔斯基

于 2009-08-28T07:16:33.137 回答
1

这是一个模式规则的例子,它应该在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)

请注意使用简单的扩展变量赋值运算符 ( :=) 而不是递归赋值运算符 ( =),这可以减少更复杂的构建中重新处理的数量。

于 2009-08-28T03:36:37.120 回答