这是cdeveloper的第21篇原创
技术文章建议横屏
Makefile简介
Makefile是一个管理项目的配置文件,它主要有2个作用:
组织工程文件,编译成复杂的程序
安装及卸载程序
Makefile是被make这个程序执行的,当执行make时,假若发觉当前目录下有Makefile或则makefile文件,这么make命令都会按照这个文件的内容来找到相关的文件,之后去执行编译,链接,安装,卸载等操作,这就实现了使用make+Makefile来管理项目的功能。
这篇文章主要是介绍编撰Makefile的基础句型,帮助你还能编撰和理解通常的Makefile文件。
怎么系统的学习Makefile
想要系统的学习Makefile,须要2个条件:
Makefile官网:
大量练习编撰Makefile:想要系统学习,必须自己练习
由于make是GNU开发的开源软件,所以官网的资料可以说是最好的,这也是开源的力量,这篇文章只是带你入门,想要精通还要自己努力。
make的工作流程
在学习Makefile句型之前,我们先来学习下make是怎样解析Makefile文件的,主要分为下边4个步骤:
在当前目录下查找Makefile或则makefile的文件
找到然后,解析并得到最终要生成的目标文件
按照时间戳生成目标文件
递归去找寻其他目标文件的依赖文件,并递归生成
只须要了解这个步骤即可,这是为帮助你理解执行make后发生了哪些事情,清楚自己在做些哪些。
第一个Makefile
我们先写一个最简单的Makefile来熟悉编译,执行,清除,安装,卸载HelloWorld的操作,借以来熟悉通用的过程。
编撰hello.c
这个程序复印HelloWorld,十分简单:
#include
int main(void) {
printf("Hello World!n");
return 0;
}
编撰Makefile
这个Makefile其中包含的就是基本的gcc编译指令和一些shell指令:
hello:
gcc hello.c -o hello
clean:
rm ./hello
install:
cp ./hello /usr/local/bin/hello
uninstall:
rm /usr/local/bin/hello
注意:使用Table键来缩进,否则会出现句型错误!
编译
如今有了Makefile,我们就可以直接在终端键入make来编译啦:
make
# make 之后打印的信息
gcc hello.c -o hello
我们看见只有一条复印信息,就是我们写的那条编译指令linux模拟,联想到我们自动编译他人的软件时,我们也是键入make之后屏幕就被一大串信息刷屏了,虽然这些信息跟这个本质上是一样,也是Makefile中的指令。
执行
执行./hello:
./hello
# 结果
Hello World!
可见这些方式愈加简单了,除了这般,还可以很容易清除可执行文件。
清除
还记得我们在Makefile中写了一个clean:吗,它下边还有一条删掉文件的指令,我们在终端键入:
make clean
# make clean 打印的信息
rm ./hello
可以看见makeclean帮助我们删掉了hello,是不是非常便捷,之后再也不用敲那一大串gcc编译命令和自动删掉文件了,效率顿时又提高了。
安装
还记得使用sudomakeinstall来安装程序吗?我们也在终端键入下边的命令:
sudo make install
# 提示输入 root 密码
[sudo] password for orange:
cp ./hello /usr/local/bin/hello
# 直接执行 hello
hello
# 输出
Hello World!
可以看出安装的过程似乎就是拷贝程序的过程。
卸载
卸载使用sudomakeuninstall,我们卸载hello:
# 卸载
sudo make uninstall
rm /usr/local/bin/hello
# 再次执行 hello,提示没找到即已经删除
bash: /usr/local/bin/hello: No such file or directory
至此,我们早已了解使用一个简单的Makefile来编译,清除,安装,卸载程序的事例,下边就来学习一些常用的Makefile句型吧。
Makefile基础句型
先来瞧瞧Makefile的编撰规则。
Makefile编撰规则
Makefile由若干条规则组成linux中makefile文件,规则格式如下:
目标(target): 依赖(prerequisites)
命令(command)
比如:
main : main.o
gcc main.o -o main
main.o : main.c
gcc -c main.c -o main.o
其中main是最后生成的目标文件,main.o是依赖文件,gccmain.o-omain是编译命令,要注意的是main.o是由main.c生成的,所以还须要一条编译main.c生成main.o的规则,这种依赖关系规则共同组成了最后的Makefile。
Makefile变量
Makefile的变量分为3类:
用户自定义变量
预定义变量
环境变量
1.用户自定义变量
定义格式如下:
VAR_NAME = var_value
使用$(VAR_NAME)来引用变量,例如:
file_name = hello.chello:
gcc $(file_name) -o hello
2.预定义变量
Makefile常见的预定义变量有下边这种:
我们可以直接使用或则重新定义这种变量,来看个使用CFLAGS和CC的事例:
CFLAGS = -g
CC = gcc
hello:
$(CC) $(CFLAGS) hello.c -o hello
这句编译指令就相当于gcc-ghello.c-ohello,我们降低了[-g]编译参数,来瞧瞧实际make的疗效:
make
# make 后的效果
gcc -g hello.c -o hello
3.环境变量
Makefile常用的环境变量有下边这种:
这儿我们以$^和$@为例:
hello : hello.o
gcc $^ -o $@
hello.o : hello.c
gcc -c hello.c
瞧瞧make的结果:
make
# 一共执行了 2 条指令
gcc -c hello.c
gcc hello.o -o hello
可以发觉$^=hello.o,$@=hello,符合这两个预定义变量的定义。
Makefile伪目标
先来看一个伪目标:
.PHONY: installinstall:
cp hello /usr/local/bin/hello
伪目标install表示虽然当前文件夹内有install这个文件,而且make执行的依然是Makefile内部的install,不会使用外部的文件,相当于进行了一个内部封装。
Makefile包含
一个Makefile可以包含另一个Makefile,须要使用include指令,比如:
include dir/Makefile
这儿我们包含了当前目录下dir下的Makefile文件。
Makefile嵌套
在小型的项目中,我们常常须要一个Makefile来嵌套调用另一个目录下的Makefilelinux防火墙设置,这是可以使用下边的指令:
submake:
cd dir && gcc hello.c -o hello
意思是先步入dir,然后执行前面的编译指令。比如我们在dir目录下新建hello.c,在上一级目录下使用前面的命令作为Makefile,我们来make:
make
# 结果
cd dir && gcc hello.c -o hello
Makefile条件判定
在Makefile中也可以进行条件判定,格式如下:
ifeq
...
else
...
endif
注意:上面不能用table分隔,来看一个反例:
CC = gcc
hello:
ifeq ($(CC),gcc)
gcc hello.c -o $@
else
gcc hello.c -o hello2
endif
意思很容易理解,当CC=gcc时编译的输出文件名为hello,否则为hello2,我们瞧瞧make的结果:
# CC = gcc
make
gcc hello.c -o hello
# CC != gcc
make
gcc hello.c -o hello2
可以看见输出文件名是不同的,说明判定是有效的。
Makeifle管理命令
Makefile有几个管理命令须要了解:
我们这儿介绍下上面两个:
例如,我们在dir目录下放了hello.c和Makefile2个文件,使用下边的shell命令来在上一级目录编译:
make -C dir/
# make 结果
make: Entering directory '/home/orange/Desktop/Makefile/hello/dir'
gcc hello.c -o hello2
make: Leaving directory '/home/orange/Desktop/Makefile/hello/dir'
可以看见make先步入这个dir目录,然后编译,之后退出。
我们可以使用[-f]指定一个文件作为Makefile,比如:
make -f cdeveloper.mk
gcc hello.c -o hello
cdeveloper.mk内容就是普通Makefile的内容,只是名子变了而已,其实名子你可以随便改linux中makefile文件,而且内容必须符合Makefile句型。
结语
通过这篇文章,我们学习了Makefile的基础句型,假如须要愈发系统的学习,建议你看GNUMakefile的官方文档,那才是最好最权威的学习资料。
看官网的英语文档,除了才能学到知识,能够锻练英语水平,这是再好不过了事了,不过你须要有毅力,不能怕困难。
最后,感谢你的阅读,我们上次再会:)
随手点赞,手留余香
·END·
坚持技术原创
技术·生活·职场
个人主页: