Makefile
Makefile 是一种程序构建工具,可在 Unix、Linux 及其衍生版本上运行。 它有助于简化构建可能需要各种模块的程序可执行文件。 为了确定模块需要如何一起编译或重新编译,make 需要用户定义的 makefile
的帮助。 本教程将增强我们对 makefile
的结构和实用程序的了解。
为什么使用 Makefile
编译源代码文件可能会很累,尤其是当我们必须包含多个源文件并在每次需要编译时键入编译命令时。 Makefile
是简化此任务的解决方案。
Makefile
是帮助自动构建和管理项目的特殊格式文件。
例如,假设我们有以下源文件。
- main.cpp
- hello.cpp
- factorial.cpp
- functions.h
main.cpp
下面是 main.cpp 源文件的代码
#include <iostream>
using namespace std;
#include "functions.h"
int main(){
print_hello();
cout << endl;
cout << "The factorial of 5 is " << factorial(5) << endl;
return 0;
}
hello.cpp
下面给出的代码是针对 hello.cpp 源文件的
#include <iostream>
using namespace std;
#include "functions.h"
void print_hello(){
cout << "Hello World!";
}
factorial.cpp
factorial.cpp 的代码如下
#include "functions.h"
int factorial(int n){
if(n!=1){
return(n * factorial(n-1));
} else return 1;
}
functions.h
以下是 fnctions.h 的代码
void print_hello();
int factorial(int n);
编译文件和获取可执行文件的简单方法是运行命令
$ gcc main.cpp hello.cpp factorial.cpp -o hello
此命令生成 hello 二进制文件。 在这个例子中,我们只有四个文件,而且我们知道函数调用的顺序。 因此,键入上述命令并准备最终的二进制文件是可行的。
然而,对于拥有数千个源代码文件的大型项目,维护二进制构建变得困难。
make 命令允许您管理大型程序或程序组。 当我们开始编写大型程序时,我们会注意到重新编译大型程序比重新编译短程序需要更长的时间。 此外,我们注意到通常只处理程序的一小部分(例如单个函数),而其余程序的大部分内容都没有变化。
在随后的部分中,我们将看到如何为我们的项目准备一个 makefile。
需要准备的知识
Makefile
在编译和链接程序模块时指导 make 实用程序。 任何想使用 make 实用程序编译他们的程序并想获得有关 makefile
的知识的人都应该阅读本教程。
本教程要求对 C
和 C++
等编程语言有很好的理解。 读者应了解链接、加载概念以及如何在 Unix/Linux 环境中编译和执行程序。