在 Linux 上使用 Make 命令编译 C 程序

举报
Tiamo_T 发表于 2022/03/22 11:11:44 2022/03/22
【摘要】 当您从源代码安装任何软件时,您通常会执行诸如“make”、“make install”、“make clean”之类的命令。您是否想知道所有这些 make 命令到底在做什么?当然,我们知道它正在尝试编译和安装软件。但是,为什么要制作?它的真正作用是什么?

当您从源代码安装任何软件时,您通常会执行诸如“make”、“make install”、“make clean”之类的命令。您是否想知道所有这些 make 命令到底在做什么?当然,我们知道它正在尝试编译和安装软件。但是,为什么要制作?它的真正作用是什么?

对于编译单个 C 程序,cc 命令非常有用。对于编译多个 C 程序,Make 实用程序非常有用。

此外,C 程序员和系统管理员会发现使用 make 实用程序自动执行与编译相关的任务很有帮助。在本文中,让我们了解一下如何使用 make 命令。

1. 为简单编译创建 Makefile

让我们假设您有一个名为 helloworld.c 的示例 C 程序文件。使用 cc 命令,通常你会编译它,如下所示。

$ cc -o helloworld helloworld.c

虽然您不需要使用 make 来编译单个程序,但以下示例将让您了解如何使用 make。创建一个makefile,如下所示。

$ vim makefile
helloworld : helloworld.c
	cc -o helloworld helloworld.c

执行 make 以创建 helloworld 可执行文件,如下所示。

$ make helloworld

(or)

$ make

由于 makefile 只包含一个目标“helloworld”,因此您也可以不带任何参数调用 make 命令,如上所示。“make”。

请确保 makefile 和源代码都存在于同一目录中,否则请在 makefile 中指定源文件的相应路径。

默认情况下,make 命令期望 make 文件名是Makefilemakefile。如果 make 文件名不同于这两个中的任何一个,则应使用 -f 选项将其指定给 make 命令,如下所示。

$ make -f sample.txt

对于那些不熟悉 C 的人,请阅读C Hello World Program文章。

2. 创建 Makefile 编译多个文件

对于多文件编译,让我们使用三个文件——getname.c、getaccno.c 和 main.c。

基于这三个 *.c 文件,让我们创建一个名为“getinto”的可执行文件。

使用 cc 命令,您通常会执行如下所示的编译。

$ cc -o getinfo main.c getname.c getaccno.c header.h

您还可以编译单个 *.c 文件,如下所示,最后创建“getinfo”可执行文件,如下所示。

$ cc -c getname.c
$ cc -c getaccno.c
$ cc -c main.c
$ cc -o getinfo main.o getname.o getaccno.o header.h

使用我们友好的 make 实用程序,您可以有效地执行此操作,如下所示。

$ vim makefile
getinfo:getname.o getaccno.o main.o header.h 
	cc -o getinfo getname.o getaccno.o main.o header.h 
main.o:main.c 
	cc -c main.c 
getaccno.o:getaccno.c 
	cc -c getaccno.c 
getname.o:getname.c 
	cc -c getname.c 

最后执行make命令,如下图。

$ make getinfo 

注意:每次调用 make 命令时,它只检查和编译被修改的文件。这对于 C 程序员来说是巨大的,他们通常有多个 C 文件,并且在开发阶段多次编译整个项目。

您还可以使用 gdb 调试 C 程序

3.为清理过程添加目标

在makefile(或Makefile)内部,还可以添加target来清理目标文件,如下图。

clean : 
	rm getname.o getaccno.o main.o

现在您可以从当前目录中清除目标文件,如下所示。

$ make clean

注意:除了在 r​​m 命令中指定单个 *.o 文件,您还可以提供 rm *.o。

您还可以使用 ar 命令创建C 存档文件 (*.a)

4. Makefile中的变量处理

在 makefile(或 Makefile)中,您可以使用可在整个 makefile 中使用的变量。下面显示了一个示例用法,其中 $obj 包含所有目标文件名。

$ vim makefile
obj= getname.o getaccno.o main.o
getinfo: $(obj) header.h
	cc -o getinfo getname.o getaccno.o main.o header.h
main.o:main.c
	cc -c main.c
getaccno.o:getaccno.c
	cc -c getaccno.c
getname.o:getname.c
	cc -c getname.c

clean:
	rm getinfo $(obj)

5. 进一步简化 Makefile

Make 实用程序隐式调用 cc -c 命令为相应的 .c 文件生成 .o 文件。我们真的不需要在makefile 中指定“cc -c”。所以,我们可以重写makefile来反映这个隐含的规则,如下所示。

$ vim makefile
obj= getname.o getaccno.o main.o
getinfo: $(obj) header.h
	cc -o getinfo getname.o getaccno.o main.o header.h
main.o:
getaccno.o:
getname.o:
clean:
	rm getinfo $(obj)

6. 在 Makefile 中插入调试信息

当你在编译一个大项目时,你可能想要显示一些友好的信息。Make 实用程序可以将消息打印到标准输出,这可能有助于您调试 make 过程中的任何潜在问题。如下所示在整个 makefile 中使用 @echo 语句来显示自定义消息。

$ vim makefile
obj= getname.o getaccno.o main.o
getinfo: $(obj) header.h
	cc -o getinfo getname.o getaccno.o main.o header.h	
	@echo "make complete."
main.o:
getaccno.o:
getname.o:
clean:
	rm getinfo $(obj)
	@echo "getinfo, $(obj) files are removed."	
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。