【问题标题】:How can I use GNU make to compile multiple nonrelated source files into multiple nonrelated object files?如何使用 GNU make 将多个不相关的源文件编译成多个不相关的目标文件?
【发布时间】:2014-03-30 17:42:05
【问题描述】:

我一直在学习 gnu make 和 Makefiles。当我使用许多依赖对象、头文件和源文件时,Makefile 让我的生活变得更轻松。我听说 make 可以用来做各种自动化魔术所以我很好奇我是否可以用它来将不相关的文件与不相关的主要功能编译成不相关的目标文件,并且都在同一个目录中。

这里有一些代码可以做我想做的事情:

CC=gcc
CFLAGS=-g -Wall -std=gnu99 -DNDEBUG
all:
    $(CC) $(CFLAGS) file1.c -o file1
    $(CC) $(CFLAGS) file2.c -o file2
    $(CC) $(CFLAGS) file3.c -o file3
    $(CC) $(CFLAGS) file4.c -o file4
    etc...

我知道如何制作 *.c 文件的列表,然后像这样完成相应的目标文件:

TARGET=$(wildcat *.c)
OBJECTS=$(patsubst %.c,%,$(SOURCES))

但这只会分别给我一个文件列表。如何处理该列表中的单个文件,以便一次编译一个文件?

【问题讨论】:

  • 您可以为每个目标文件创建依赖关系 - 然后只需 make 目标文件,它就会为您创造奇迹......
  • 只要all: file1 file2 file3 file4

标签: c makefile


【解决方案1】:

大家都知道了,谢谢大家的投入。这是一个简单的解决方案,它完全符合我的要求:

SOURCES=$(wildcard *.c)
OBJECTS=$(patsubst %.c,%,$(SOURCES))
all: $(OBJECTS)

【讨论】:

    【解决方案2】:

    Make 是所谓的基于规则的专家系统。你给它确定依赖关系的规则以及每一步要做什么(已经有很多通用模式可以覆盖预定义的),给它一个目标,然后 make 决定如何到达那里以及(重新)执行什么。

    没有人阻止你给 make 一个明确的目标,而不是让它做默认的目标(通常是你的 makefile 中的第一个)。

    以这种方式覆盖依赖项:

    all: file1 file2 file3
    

    【讨论】:

      【解决方案3】:

      事实上,从对应的 *.c 文件生成 *.o 文件的规则是 make 内置规则集的一部分:在 c 文件上调用 $(CC) -c。也就是说,对于该任务,您甚至不需要 Makefile,更不用说列出其中的单个源了。只需说“makewhatevername.o”即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 2013-08-13
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多