gmake 编译目录中的所有文件

发布于 2024-08-03 03:18:18 字数 293 浏览 5 评论 0原文

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

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

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

它的作用是为每个 %.C 文件(即每个 .C 文件)构建一个相应的 .o 文件。

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

干杯

马克

we have some C++ code that we need to create a make file in. Each .h and .C pair create an object and then some objects are linked together to form a executable. Pretty standard stuff.

This non-gnu make command just builds all the files into object in a directory

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

What this does is for each %.C file (ie every .C file) build a corresponding .o file.

Does anybody know how to do this with gmake?

Cheers

Mark

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

海之角 2024-08-10 03:18:18

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

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

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

如果您正在寻找更简洁的东西,以下内容也将起作用:

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

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

希望有帮助,

埃里克·梅尔斯基

The syntax you've shown is called a pattern rule in GNU make parlance, and it forms the corner stone of your solution. All you need is to add a way to get the list of .C files dynamically. Others have shown solutions that use $(shell) to do this, but that's needlessly inefficient. I suggest you instead use $(wildcard), which is a GNU make built-in function designed for just this purpose:

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

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

If you are looking for something more concise, the following will work too:

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

This just eliminates the variables and takes advantage of the fact that GNU make provides a default %.o: %.C pattern rule, as well as a default rule for linking an executable together from a set of objects. Personally I would use the more verbose version as I find it easier to read and maintain, but to each their own.

Hope that helps,

Eric Melski

向日葵 2024-08-10 03:18:18

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

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

This is an example of a pattern rule, it should work fine in gmake. For very simple builds like this you can mostly rely on the implicit rules. The main thing you have to specify in the target you want to build and its dependencies:

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)

Note the use of simply expanded variable assignment operator (:=) rather than the recursive assignment operator (=) which can reduce the amount of reprocessing make does in more complicated builds.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文