在 Linux 上使用 Make 命令编译 C 程序
当您从源代码安装任何软件时,您通常会执行诸如“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 文件名是Makefile或makefile。如果 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
注意:除了在 rm 命令中指定单个 *.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."
- 点赞
- 收藏
- 关注作者
评论(0)