gmake编译目录中的所有文件

时间:2009-08-28 03:06:35

标签: makefile gnu-make

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

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

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

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

有人知道如何使用gmake吗?

干杯

标记

2 个答案:

答案 0 :(得分:22)

您所显示的语法在GNU make parlance中称为模式规则,它构成了解决方案的基石。您所需要的只是添加一种动态获取.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模式规则的事实,以及将可执行文件从一组对象链接在一起的默认规则。就个人而言,我会使用更详细的版本,因为我觉得它更容易阅读和维护,但对于每个版本都是如此。

希望有所帮助,

Eric Melski

答案 1 :(得分:1)

这是pattern rule的示例,它应该在gmake中正常工作。对于这样非常简单的构建,您可以主要依赖implicit rules。您必须在要构建的目标及其依赖项中指定的主要内容:

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)

注意使用simply expanded variable赋值运算符(:=)而不是递归赋值运算符(=)可以减少再处理的数量,这可以在更复杂的构建中完成。