【问题标题】:Why do we use "make" command when "cc ex1.c -o ex1" compiles the code written in "exe1.c" file为什么我们在“cc ex1.c -o ex1”编译“exe1.c”文件中的代码时使用“make”命令
【发布时间】:2019-10-03 07:22:05
【问题描述】:

我在 Linux 中学习 C 编程时遇到了这行代码

$ make ex1

cc ex1.c -o ex1

我的问题是为什么我们必须使用make ex1cc 命令不是在构建程序和其他必要的文件吗?

【问题讨论】:

  • 请提出我在编程方面的不足之处。我从我的课程书籍中学习过,其中没有提到这些事情,我在哪里可以获得有关这方面的详细知识。
  • 不需要使用make 来构建您的程序。这是一种方便。对于您演示的简单的单源程序,便利性很小,但对于大多数真实世界的程序和库来说,便利性是引人注目的。

标签: c linux ubuntu makefile compilation


【解决方案1】:

除了一小部分非常简单的问题外,几乎所有现实生活中的 C 程序都将由多个模块、头文件、外部库构建,有时跨越多个文件夹。在某些情况下,可能会使用不同的工具(例如代码生成器)链接其他代码。

对于这些情况,单个“cc”命令将不起作用。下一个解决方案将是使用构建脚本自动构建。但是,这可能很耗时,而且几乎无法维护。

对于构建“C”程序,Make 在简单的 shell 构建脚本之上提供了许多好处。这是我个人的“前三名”

  • 增量构建 - 当代码文件被修改时,make 可以识别执行最小的构建指令集,而不是重新构建整个代码。这可以大大提高开发人员的效率。
  • 基于规则的构建 - make 使用规则来生成目标。一旦你定义了一条规则(一条明显的规则:将“.c”文件编译为“.o”),它们就可以一致地应用于所有文件。
  • 为完整的构建过程提供设置 - 包括安装代码、清理、打包、测试等。非常重要的是,make 可以将(几乎)任何 Unix 工具集成到构建过程中 - 代码生成等。

不用说,还有其他构建工具可以提供额外/替代的好处。 CMake、gradle、SCons 等等。

【讨论】:

    【解决方案2】:

    对于单文件项目,它们的结果大致相同。然而,现实世界的项目往往有数十、数百或数千个文件,并构建数十或数百个库和可执行文件,可能具有不同的设置等。在不将编译命令存储在某处的情况下管理所有这些是不可能的,并且 Makefile是一个非常有用的“某处”。

    make 的另一个重要属性是它对文件进行时间戳检查,并且仅重新运行其输出已过时的编译/链接命令,即至少它们的一个输入比输出新。如果没有这样的检查,您必须在更改某些内容时手动记住要重新编译哪些文件(当更改的文件是头文件时尤其困难),或者总是重新编译所有内容,从而将构建时间增加几个数量级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2022-10-08
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      相关资源
      最近更新 更多