我们需要一些C ++代码来创建一个make文件。每个.h和.C对创建一个对象,然后一些对象链接在一起形成一个可执行文件。非常标准的东西。
这个非gnu make命令只是将所有文件构建到目录中的对象
%.o:%.C
$(CC) $(CPFLAGS) -c $<
这样做对每个%.C文件(即每个.C文件)构建一个相应的.o文件。
有人知道如何使用gmake吗?
干杯
标记
答案 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赋值运算符(:=
)而不是递归赋值运算符(=
)可以减少再处理的数量,这可以在更复杂的构建中完成。