Shell脚本——make命令和Makefile文件
make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文件中描述源程序之间的依赖关系进行自动编译;
makefile文件是按照规定格式编写,需说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系;
首次执行make命令时,编译所有相关文件,之后再执行make命令时,以增量方式进行编译,即只对修改的源文件相关的目标文件进行编译;
注:许多tarball格式的开源软件,解压后先执行./configure,再执行make,然后执行make install进行安装;
makefile文件支持include,即把一些基本依赖规则写在一个公共文件中,其他makefile文件包含此文件;
通常公共makefile文件命名为common.mk;
一、make命令
make命令后接参数,称为目标;
1 常见目标
make all:编译所有目标
make install:安装已编译的程序
make uninstall:卸载已安装的程序
make clean:删除由make命令产生的文件,通常删除目标文件.o
make distclean:删除由./configure产生的文件
make check:测试刚编译的软件
make installcheck:检查安装的库和程序
make dist:重新打包成packname-version.tar.gz
执行make命令时,需要一个Makefile文件,以告诉make命令如何编译和链接程序;
2 参数
-B:重新建立所有目标
-d:打印调试信息
-C:切换到指定路径下寻找Makefile
-f:将指定文件看做Makefile
-j:同时运行命令的个数,即多线程执行Makefile,后接的个数可由nproc命令返回值来指定
注:nproc命令打印当前进程可用的处理数(线程数);
二、程序的编译和链接
一般在C/C++开发中,首先将源文件编译成目标文件(Windows下.obj文件,Unix下.o文件)——编译compile,再将目标文件合成执行文件——链接link;
三、make命令如何工作?
1 make在当前目录下寻找“Makefile”或“makefile”文件
2 若找到,查找文件中的第一个目标文件.o
3 若目标文件不存在,根据依赖关系查找.s文件
4 若.s文件不存在,根据依赖关系查找.i文件
5 若.i文件不存在,根据依赖关系查找.c文件,此时.c文件一定存在,于是生成一个.o文件,再去执行
四、Makefile文件格式
1 概述
Makefile文件由一系列规则rules构成,每条规则形式如下:
:
[Tab]
第一行冒号前为目标,冒号后为前置条件;第二行必须由一个Tab键起首,后接命令;
目标是必须的,不可省略;前置条件和命令是可选的,但两者必须至少存在一个;
每条规则明确两件事——构建目标的前置条件是什么?如何构建?
2 目标target
目标可以是文件名,指明make命令所要构建的对象;也可以是某个操作名称,称“伪目标”;
clean:rm *.o
以上代码目标是clean,命令是rm *.o;
执行make clean命令,实现对象文件的删除;
为避免设置的伪目标名称在当前路径下有相同名称的文件,make命令发现该名称的文件已存在,便不再构建,也就不执行rm操作的情况发生,先将该名称声明为伪目标,因此make命令不会检查是否存在该名称的文件,每次执行对应的操作;
.PHONY:clean
clean:rm *.o
若make命令没有指定目标,默认执行Makefile文件中第一个目标;
3 前置条件prerequisites
前置条件通常是一组文件名,用空格隔开;
指定目标是否重新构建的判断标准——只要有一个前置条件不存在或有更新,则该目标需重新构建;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
