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

Makefile gmake编译目录中的所有文件 我们有一些C++代码,需要在其中创建make文件。每个.h和.C对创建一个对象,然后将一些对象链接在一起以形成一个可执行文件。相当标准的东西,makefile,gnu-make,Makefile,Gnu Make,这个非gnu make命令只是将所有文件构建到目录中的对象中 %.o:%.C $(CC) $(CPFLAGS) -c $< %.o:%.C $(CC)$(CPFLAGS)-c$< 这将为每个%.C文件(即每个.C文件)构建一个相应的.o文件 有人知道如何使用gmake吗 干杯 Mark这是a的一个示例,它在gmake中应该可以正常工作。对于像这样非常简单的构建,您可以主要依靠。您必须在要构建的目标及其依赖项中指定的主要内容: CXXFLAGS:=-g -O -Iinclud

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

%.o:%.C
    $(CC) $(CPFLAGS)  -c  $<
%.o:%.C
$(CC)$(CPFLAGS)-c$<
这将为每个%.C文件(即每个.C文件)构建一个相应的.o文件

有人知道如何使用gmake吗

干杯

Mark

这是a的一个示例,它在
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)

请注意,使用赋值运算符(
:=
)而不是递归赋值运算符(
=
),这可以减少在更复杂的构建中重新处理make所做的事情。

您所展示的语法在GNU make术语中称为模式规则,它构成了解决方案的基石。您所需要的只是添加一种动态获取.C文件列表的方法。其他人已经展示了使用
$(shell)
来实现这一点的解决方案,但这是不必要的低效。我建议您改为使用$(通配符),这是一个GNU make内置函数,专门用于此目的:

SRCS = $(wildcard *.C)
OBJS = $(patsubst %.C,%.o,$(SRCS))
foo: $(OBJS)
        $(CC) -o $@ $^

%.o: %.C
        $(CC) $(CPFLAGS)  -c  $<
这只是消除了变量,并利用了gnumake提供了一个默认的
%.o:%.C
模式规则,以及一个将一组对象中的可执行文件链接在一起的默认规则。就我个人而言,我会使用更详细的版本,因为我发现它更容易阅读和维护,但每个版本都有自己的版本

希望有帮助


埃里克·梅尔斯基

你错了;OP显示的是标准模式规则,而不是静态模式规则,在这里使用$(shell)是没有充分理由的,因为$(通配符)可以在不增加额外开销的情况下完成任务。@Eric:当然,静态模式规则是正确的。固定的。尽管有额外的fork,我还是经常使用$(shell),因为我经常对命令进行泛化。通过使用:=赋值,我只会得到一次额外的值。如果您愿意,您可以同样轻松地使用:=和$(通配符)。
foo: $(patsubst %.C,%.o,$(wildcard *.C))