如果您有多个 c、c++ 和其他语言的文件,并且想通过终端命令编译它们,我们该如何编译他们呢?为了解决这类问题,Makefile就出现了。Makefile在编译大型项目的过程中,可以一次性编写大量的源文件以及需要链接器标志。废话少说咱们直接开始今天的正文!

Makefile是一种用于简化或组织编译代码的工具,是一组具有变量名称和目标的命令(类似于终端命令),用于创建和删除目标文件的工具。在单个 make 文件中,我们可以创建多个目标来编译和删除对象、二进制文件。您可以使用Makefile多次编译您的项目(程序)。
让我们通过一个例子来理解:
假设我们有 3 个文件main.c(主源文件)、 misc.c(包含函数定义的源文件)、misc.h(包含函数声明)。在这里,我们将声明和定义一个名为myFunc()的函数来打印一些东西——这个函数将分别在misc.c和misc.h中定义和声明。
misc.c
#include
#include "misc.h"
/*function definition*/
void myFunc(void)
{
printf("Body of myFunc function.\n");
}
misc.h
#ifndef MISC_H
#define MISC_H
/*function declaration.*/
void myFunc(void);
#endif
main.c
#include
#include "misc.h"
int main()
{
printf("Hello, World.\n");
myFunc();
fflush(stdout);
return 0;
}
上面这个场景是非常常见也是最简单的一个多文件系统了,我们想要编译他,并将他们链接在一起该如何做呢?显然仅仅使用gcc等这些简单的编译器是不够的,此时我们就需要用到Makefile了。
下面将内容放在一个名为Makefile的文件中,注意Makefile文件的名字只能是这几个字,而且区分大小写。
Makefile
#make file - this is a comment section
all: #target name
gcc main.c misc.c -o main
保存名为Makefile。
插入注释,后跟#字符。
all是一个目标名称,在目标名称之后插入:。
gcc是编译器名称,main.c,misc.c源文件名,-o是链接器标志,main是二进制文件名。
注意: Makefile必须使用 TAB 而不是空格缩进,否则make会失败。
我们写好Makefile后怎么进行编译呢?下面是代码的编译过程:
没有目标名称:
make
带有目标名称:
make all
输出:
sh-4.3$ make
gcc main.c misc.c -o main
sh-4.3$ ./main
Hello, World.
Body of myFunc function.
sh-4.3$
此时我们就可以看到对应文件夹里已经生成了对应的可执行文件了!这就是Makefile的作用!
Makefile 用于帮助决定大型程序的哪些部分