使用gmake编译目录中的所有文件(gmake compile all files in a dir

2019-08-02 21:50发布

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

这种非GNU make命令只是建立在一个目录下的所有文件到对象

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

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

有谁知道如何用gmake命令做到这一点?

干杯

标记

Answer 1:

还有你的语法称为GNU中的图案规则做出的说法,并形成解决方案的基石。 所有你需要的是添加一种方式来获得的.C文件列表动态。 其他人已经表明使用的解决方案$(shell)要做到这一点,但这是不必要的低效。 我建议你改用$(通配符),这是一个GNU使内置的功能设计,只是这个目的:

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

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

如果你正在寻找的东西更简洁,下面的工作太:

foo: $(patsubst %.C,%.o,$(wildcard *.C))

这只是消除了变量和采取的是GNU化妆提供了一个默认的事实的优点%.o: %.C方式规则,以及从一组对象连接在一起的可执行文件默认规则。 亲自担任我觉得更容易阅读和维护,但各有所爱,我会用更详细的版本。

希望帮助,

埃里克祈祷



Answer 2:

这是一个示例模式规则 ,它应该在正常工作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)

注意使用的简单扩展变量赋值运算符( := ),而不是递归赋值运算符( = ),它可以减少再加工量确实做出更复杂的构建。



文章来源: gmake compile all files in a directory