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

前置条件通常是一组文件名,用空格隔开;

指定目标是否重新构建的判断标准——只要有一个前置条件不存在或有更新,则该目标需重新构建;


                        


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部