当“ cc ex1.c -o ex1”编译在“ exe1.c”文件中编写的代码时,为什么使用“ make”命令

时间:2019-10-03 07:22:05

标签: c linux ubuntu makefile compilation

碰到这行代码时,我正在Linux中学习C编程

$ make ex1

cc ex1.c -o ex1

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

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

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