【问题标题】:Makefiles in C languageC语言生成文件
【发布时间】:2020-08-13 13:52:23
【问题描述】:

您好,我很难理解 makefile。我和他们一起玩是为了更好地理解他们,但问题是:

all: main

main: main.o funcIO.o funcMan.o
     $(CC)  -o $@ $^
----------------------------------
funcIO.o: funcIO.c 
     $(CC)  -c -o funcIO.o funcIO.c

funcMan.o: funcMan.o
     $(CC)  -c -o funcMan.o funcMan.c

无论穿孔线下方的所有内容是否存在,这都有效。有人告诉我这是编写 makefile 的正确方法,但为什么没有目标 funcIO.o 和 funcMan.o 也能工作,如果没有它们也能工作,我们为什么要编写它们?你能像我 5 岁一样解释吗?

感谢您的宝贵时间!

【问题讨论】:

  • 因为它们已经存在于构建文件夹中,你可能没有在构建之间删除它们。
  • 或者,您可以使用现代编程 IDE 为您完成所有这些工作,并专注于实际编程。从大约 30 年前结束的控制台时代开始,制作文件已成为过去。
  • @Lundin 同意,或者只需一次调用编译器即可编译所有内容。计算机速度很快。
  • make 默认有一组隐式规则。 make、CMake 和其他构建工具并不是“过去的东西”。也不是控制台编程。随着所有类型的计算机迁移到运行在仅具有文本控制台的“机器”上的云,许多任务返回到使用 JSON、YAML、XAML 或其他方式的文本 I/O。而且项目越来越大,有几十甚至上千个文件。因此,所有 IDE 都必须与 make 或 CMake 集成。例如查看 Visual Studio 并查看对内置 CMake、ninja、NMAKE 的支持级别。编译一切都不是一种选择。
  • @Lundin 也许我使用 Makefiles 因为那是在工作中使用的。它们当然不会成为过去。

标签: c ubuntu makefile


【解决方案1】:

假设您使用的是 GNU Make(它可能与其他 Makes 相同),这是由于 built-in rules 而工作的。 Make 已经知道如何编译一个 C 源文件,除非你另有说明,否则它会应用这个秘诀:

%.o: %.c
        $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<

$@ 是规则的目标(.o 文件的文件名),$&lt; 是第一个先决条件(.c 文件的文件名)。其他变量具有合理的默认值(大部分为空)。

【讨论】:

    【解决方案2】:

    使用 Makefile 的正确方法是使它们尽可能小。 Makefiles 是关于确定依赖关系,只是偶尔可以用于构建程序。以下是我将如何重写您的 Makefile:

    all: main
    
    main: main.o funcIO.o funcMan.o
    

    我只把all 目标放在那里,因为你一开始就有它。 Make 有一个内置规则列表,这些规则知道如何在给定某些文件作为输入的情况下构建事物。如果你要求它提供一个.o 文件,它会寻找一个同名的文件,但扩展名为.c.cpp.f77 等,然后运行构建你的文件的规则要求使用该先决条件文件。您甚至不需要指定如何构建它们,它们是免费的!需要说明的是更复杂的关系(例如最终的二进制文件),如我上面的示例所示。用.o 文件构建二进制文件也有类似的规则(假设其中一个与二进制文件同名,你的文件就是这样),所以你不需要指定任何任务,只是依赖项。您可以通过调整特殊标志来控制它们的运行方式:

    CFLAGS += -Wall -Wextra -Wpedantic
    
    main: main.o funcIO.c funcMan.o
    main: LDLIBS += -lm
    

    此版本使用 CFLAGS 构建每个 C 编译文件,并在链接 -lm 数学库时构建 main

    如果您正在构建普通的 C 程序,我强烈推荐这种方法。指定最终二进制文件的先决条件,并通过这些 Make 变量控制构建。

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2012-05-21
      • 2023-03-17
      相关资源
      最近更新 更多