【问题标题】:gmake compile all files in a directorygmake 编译目录中的所有文件
【发布时间】:2009-08-28 03:06:34
【问题描述】:

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

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

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

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

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

干杯

标记

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

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

    希望对你有帮助,

    埃里克·梅尔斯基

    【讨论】:

      【解决方案2】:

      这是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 赋值运算符 (:=) 而不是递归赋值运算符 (=),这可以减少更复杂的构建中重新处理的数量。

      【讨论】:

      • 你错了; OP 显示的是标准模式规则,而不是静态模式规则,并且没有充分的理由在此处使用 $(shell) ,而 $(wildcard) 将在没有额外开销的情况下完成任务。
      • @Eric:当然,关于静态模式规则是正确的。固定的。尽管有额外的 fork,但我还是经常使用 $(shell),因为我经常概括该命令。通过使用 := 分配,我只遭受了一次额外的痛苦。
      • 如果您愿意,您可以轻松地将 := 与 $(wildcard) 一起使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 2011-04-17
      • 2013-07-09
      • 1970-01-01
      • 2012-02-07
      • 2018-02-02
      • 1970-01-01
      相关资源
      最近更新 更多