Linux工程管理文件Makefile-入门篇

1.Makefile简介

Makefile是在Linux环境下 C/C++ 程序开发必须要掌握的一个工程管理文件。当你使用make命令去编译一个工程项目时,make工具会首先到这个项目的根目录下去寻找Makefile文件,然后才能根据这个文件去编译程序。那Makefile在编译过程中到底起了什么作用呢?这还得从程序的编译链接过程说起。

在Windows下编写程序,你只要会使用集成开发环境(IDE,Integrated Development Environment)就可以了,因为IDE集成了程序的编写、编译、链接、运行、项目管理等一条龙服务,一个编程小白,安装好IDE后,新建一个文件,编写好程序,点击菜单栏上的运行(Run)按钮,程序就可以跑起来了,程序员不需要关心程序在底层是如何编译和运行的。

而在Linux下编写程序,因为早期没有成熟的IDE,一般都是使用不同的命令进行编译:将源文件分别使用编译器、汇编器、链接器编译成可执行文件,然后手动运行。以一个最简单的helloworld程序为例:

// helloworld.c
#include <stdio.h>
int main(void){    
	printf("hello QST.com!\\n");    
	return 0;
}

如果想要将上面的 helloworld.c 编译成可执行文件,一般需要预处理、编译、汇编、链接四个步骤,每个步骤会分别调用预处理器、编译器、汇编器、链接器来完成。

在Linux环境下,如果你安装了GCC编译器,你会看到在程序的安装目录下面会有各种二进制可执行文件:

  • cpp:预处理器
  • ccl:编译器
  • as:汇编器
  • ld:链接器
  • ar:静态库制作工具

程序在编译过程中会分别使用这些工具,完成程序编译的每个流程。为了简化程序编译流程,GCC编译器一般会提供一个gcc命令,当你使用gcc命令去编程程序时:

# gcc -o a.out helloworld.c

gcc会分别调用预处理器、编译器、汇编器和链接器来自动完成程序编译的整个过程,不需要用户一个命令一个命令分别输入了。

当然,gcc还提供了一些列参数,用来控制编译流程。如果你只想对 helloworld.c 进行预处理,不作编译。你可以使用-E参数来完成:

# gcc -E helloworld.c

如果你想helloworld.c只做汇编处理,可以使用下面的命令,就可以将源文件 helloworld.c 编译为汇编文件helloworld.S:

# gcc -S -o helloworld.S helloworld.c

如果你只想对源文件进行编译,不链接,可以使用-c参数,就可以将 helloworld.c 编译为对应的目标文件 helloworld.o:

# gcc -c -o helloworld.o helloworld.c

对于一些简单的程序,单文件程序,使用gcc编译非常方便。当一个项目很大,源文件很多时,此时再使用gcc编译,可能就变成了下面这个样子:

# gcc -o a.out helloworld.c module1.c module2.c module3.c ...

以Linux内核源码为例,有好几万个源文件(.c、.S和.h),如果还使用gcc编译的话,每编译一次,都要敲进去几万个源文件,太折腾了,此时自动化编译工具make就派上用场了:使用make编译程序,不需要每次都输入源文件,直接在命令行下敲击make命令,就可一键自动化完成编译。

make编译依赖Makefile文件。所以在使用make命令编译程序之前,你还需要编写一个Makefile文件:

a.out: helloworld.o    
	gcc -o a.out helloworld.o
helloworld.o: helloworld.c    
	gcc -c -o helloworld.o helloworld.c
clean:    
	rm -f a.out helloworld.o

编写Makefile文件后,把它和helloworld.c源文件放在同一个目录,进入这个目录,直接敲击make密令,就可以自动完成程序的编译了。

wit@pc:/home/makefile
# ls
helloworld.cMakefilewit@pc:/home/makefile# makegcc -o a.out helloworld.cwit@pc:/home/makefile# lsa.out  helloworld.c  helloworld.oMakefilewit@pc:/home/makefile# ./a.outhello world!wit@pc:/home/makefile# make cleanrm -f a.out helloworld.owit@pc:/home/makefile# lshelloworld.cMakefile

makefile的文件名通常有三种格式:Makefile、makefile、GNUmakefile,make会在当前目录下自动寻找找三个文件名,如果没有找到的话,make就无法继续编译程序,产生一个错误并退出:

make: *** No targets specified and no makefile found.  Stop.

 2.Makefile学习的重要性

Makefile在整个项目工程管理和程序的编译链接过程中,都扮演了一个非常重要的角色,是linux/Unix环境下开发必备技能,也是系统架构师、项目经理的核心技能。掌握了Makefile,会让你对底层软件的构造系统、程序的编译过程有一个更深的理解。

掌握了​​​​​​​Makefile的基本原理,然后跟Windows下的IDE进行比较,你会发现,它们的工作原理也是大同小异,是相通的:

当你在C-Free或者VC++6.0环境下,通过工程管理器、资源管理器类似的窗口,往项目中添加源文件时,在底层会自动生成对应的​​​​​​​Makefile类似的文件。当你点击编译或运行按钮时,IDE会根据这个​​​​​​​Makefile文件去编译程序。不同的IDE,对应的Makefile文件名、文件格式可能有所差异,比如VC++6.0使用的是Nmake,但原理都是一样的:通过​​​​​​​Makefile,我们可以构建编译一个可执行文件a.out需要的源文件。根据这个依赖关系,make工具就可以分别调用gcc命令分别将每个源文件编译成对应的目标文件,然后将它们链接成最后的可执行文件:a.out

会不会写Makefile,是侧面可以看出一个人是否具有完成大型项目工程的能力。如果你是在Linux下进行C/C++开发,掌握​​​​​​​Makefile可能让你更深地去理解项目,去掌控整个项目的构建和维护。

Makefile也是一个研究开源项目的利器。很多开源项目可能文档不完整,而Makefile就是开源项目的地图,从Makefile入手,可以让你快速窥探整个开源项目的框架和概貌,让你深入代码而不至于迷路。

综上所述,如果你是一名Linux下的开发工程师、嵌入式工程师、内核驱动开发工程师,掌握Makefile是一门必备技能。它和git、vim一样,掌握了这个“Linux三剑客”会让你的工作事半功倍、更加高效。

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值