make和makefile的使用方法

在大型项目开发中,手动编译每个源文件效率低下。make工具通过makefile文件自动化编译流程,使得通过一个命令就能完成多个动作。默认make会找寻makefile、Makefile或GNUmakefile。通过'-f'选项可指定makefile名称。makefile的基本格式包括目标体、依赖文件和执行命令,如:hello.o: hello.c gcc -c hello.c -o hello.o。make会自动处理依赖关系,如执行'make hello'。伪目标如'clean'用于执行清理任务,如'rm *.o temp'。了解更多信息可参考GNU make文档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在大型项目开发中,通常有几十到上百个源文件,如果每次均手工键入gcc 命令进行编译的话,非常不方便,我们就思考,能不能用一个命令完成多个动作——这就是make的用处。

make工具通过makefile文件来完成并自动维护编译工作:我们可以用vi makefile来创建makefile文件,通过makefile文件的内容告诉make要做什么。

默认情况下,GNU make工具在当前工作目录中寻找makefile时,它会尝试以下几个名称(按顺序排列):GNUmakefile、makefile 和 Makefile,不建议使用GNUmakefile,有些版本的make可能不承认这个名称。

我们也可以选择给makefile使用一个自己指定的名字,可以用’-f’或’–file’选项来指定makefile的名称:用参数’-f NAME’或’–file=NAME’告诉’make’读取文件NAME作为makefile。

一个简单的makefile格式如下:

 TARGET ... : DEPENDENCY ...
 	COMMAND

注意:这里COMMAND前面一定是Tab,即使按了8次Space键视觉效果看起来一样也会报错(missing separator (did you mean TAB instead of 8 spaces?)。如果是复制代码再粘贴,也可能会出现这个问题,这就需要删掉代码里的空格重新输入Tab。

TARGET
目标体,通常是一个由程序生成的文件的名称;目标体可以是可执行文件或目标文件,也可以是一个要执行的动作的名称,例如伪目标“clean”。
DEPENDENCY
目标体所依赖的文件,它被用来作为输入来创建目标。 一个目标经常依赖于几个文件。
COMMAND
所创建的目标体需要运行的命令,是 "make "执行的一个动作。 一个command可以有一个以上的命令,可以在同一行,也可以在各自的行中。

举个例子,我们先写一个名为“hello.c”的程序

#include<stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}

再使用vi makefile命令创建一个名为makefile的新文件,按“i”进入编辑模式插入文本,输入下列代码(注意Tab! Tab! Tab! 的问题)

hello.o:hello.c
        gcc -c hello.c -o hello.o
hello:hello.o
        gcc hello.o -o hello

这里hello.o就是第一个目标体,hello.c是它依赖的文件(执行第一个命令需要的文件);
hello是第二个目标体,hello.o是它依赖的文件(执行第二个命令需要的文件)。
如果我们不加目标体,直接调用make,它会自动地执行第一个目标体,在这个例子里就是hello.o;要想让它执行第二个目标体,可以用“make+目标体”,在这个例子里就是make hello。

如果我们对上面那个makefile做出如下修改(调换第一和第二个目标体的位置)

hello:hello.o
        gcc hello.o -o hello
hello.o:hello.c
        gcc -c hello.c -o hello.o

我们会发现,调用make命令后仍然可以正常执行。
要想完成hello就必须依赖hello.o,根据make的“隐式规则”,执行hello时会自动的生成它的依赖文件hello.o,并且在使用该文件后不会将其删除,在当前目录下使用“ls”命令还可以查看到“hello.o”。

如果我们只想执行某个操作而不生成文件可以使用“伪目标”。
例如

clean:
	rm *.o temp

'rm’命令将在每次你说’make clean’时被执行,但是它永远不会创建一个名为’clean’的文件。

要想了解更多make的使用规则和用法,可以点击链接阅读
GNU_make

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值