ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux Makefile

2022-01-16 22:02:50  阅读:132  来源: 互联网

标签:文件 gcc Makefile make makefile linux test


一.C语言编译过程

在这里插入图片描述

二.Makefile简介

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定**,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作**,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

make主要解决两个问题:

  1. 大量代码的关系维护

大项目中源代码比较多,手工维护、编译时间长而且编译命令复杂,难以记忆及维护

把代码维护命令及编译命令写在makefile文件中,然后再用make工具解析此文件自动执行相应命令,可实现代码的合理编译

  1. 减少重复编译时间

n 在改动其中一个文件的时候,能判断哪些文件被修改过,可以只对该文件进行重新编译,然后重新链接所有的目标文件,节省编译时间

Makefile文件命名规则
makefile和Makefile都可以,推荐使用Makefile。

make工具的安装
sudo apt install make

三.Makefile语法规则

一条规则:

目标:依赖文件列表
命令列表
自上而下,分解任务
执行:make

二条规则:
伪目标不去判断目标文件是否存在或者已经更新
无条件执行命令

伪目标
.PHONY:
clean:(不用tab)
rm -rf $(OBJS) $(TARGET)
执行:make clean

Makefile基本规则三要素:

注:这俩文件名字随便取,目的是为了链接

1)目标文件:
通常是要产生的文件名称,目标可以是可执行文件或其它obj文件,也可是一个动作的名称(必须有)
只能一个
2)依赖文件:
用来输入从而产生目标的文件
一个目标通常有几个依赖文件(可以没有)
可以一个可以多个
3)命令:
make执行的动作,一个规则可以含几个命令(可以没有)
有多个命令时,每个命令占一行
测试代码:

例:
test:
echo “hello world”

test:test1 test2
echo “test”
test1:
echo “test1”
test2:
echo “test2”
make命令格式
make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。

四.Makefile解析工具–make命令格式:

make [ -f file ][ options ][ targets ]

1.[ -f file ]:

make默认在工作目录中寻找名为GNUmakefile、makefile、Makefile的文件作为makefile输入文件
-f 可以指定以上名字以外的文件作为makefile输入文件
l

2.[ options ]

-v: 显示make工具的版本信息
-w: 在处理makefile之前和之后显示工作路径
-C dir:读取makefile之前改变工作路径至dir目录
-n:只打印要执行的命令但不执行
-s:执行但不显示执行的命令
3.[ targets ]:

若使用make命令时没有指定目标,则make工具默认会实现makefile文件内的第一个目标,然后退出
指定了make工具要实现的目标,目标可以是一个或多个(多个目标间用空格隔开)。

6.1 最简单的Makefile

test:test.c add.c sub.c mul.c div.c
    gcc test.c add.c sub.c mul.c div.c -o test
缺点:效率低,修改一个文件,所有文件会被全部编译

6.2 第二个版本Makefile

test:test.o add.o sub.o mul.o div.o
    gcc test.o add.o sub.o mul.o div.o -o test
​
test.o:test.c
    gcc -c test.c
add.o:add.c
    gcc -c add.c
sub.o:sub.c
    gcc -c sub.c
mul.o:mul.c
    gcc -c mul.c
div.o:div.c
    gcc -c div.c

五.Makefile中的变量使用

类似C语言中宏定义
在Makefile中使用变量有点类似于C语言中的宏定义,使用该变量相当于内容替换,使用变量可以使Makefile易于维护,修改内容变得简单变量定义及使用。

7.1 自定义变量

1)定义变量方法:

变量名=变量值

2)引用变量方式:

( 变 量 名 ) 或 (变量名)或 (变量名)或{变量名}

3)makefile的变量名:

makefile变量名可以以数字开头
变量是大小写敏感的
变量一般都在makefile的头部定义
变量几乎可在makefile的任何地方使用

示例:

#变量
OBJS=add.o sub.o mul.o div.o test.o
TARGET=test


( T A R G E T ) : (TARGET): (TARGET):(OBJS)
gcc $(OBJS) -o $(TARGET)

add.o:add.c
gcc -c add.c -o add.o

sub.o:sub.c
gcc -c sub.c -o sub.o

mul.o:mul.c
gcc -c mul.c -o mul.o

div.o:div.c
gcc -c div.c -o div.o

test.o:test.c
gcc -c test.c -o test.o

clean:
rm -rf $(OBJS) $(TARGET)

自动变量

$@: 表示规则中的目标
$<: 表示规则中的第一个条件
$^: 表示规则中的所有条件, 组成一个列表, 以空格隔开,如果这个列表中有重复的项则消除重复项。

模式规则示例:

%.o:%.c
将所有的.c对应.o
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

六.Makefile中的函数

makefile中的函数有很多,在这里给大家介绍两个最常用的。

wildcard – 查找指定目录下的指定类型的文件
src = $(wildcard *.c) //找到当前目录下所有后缀为.c的文件,赋值给src

patsubst – 匹配替换
obj = $(patsubst %.c,%.o, $(src)) //把src变量里所有后缀为.c的文件替换成.o

clean命令中的特殊符号:

“-”此条命令出错,make也会继续执行后续的命令。如:“-rm main.o”
“@”不显示命令本身,只显示结果。如:“@echo clean done”

七.Makefile工作原理

在这里插入图片描述
在这里插入图片描述
总结:

Ø 分析各个目标和依赖之间的关系

Ø 根据依赖关系自底向上执行命令

Ø 根据修改时间比目标新,确定更新

Ø 如果目标不依赖任何条件,则执行对应命令,以示更新

标签:文件,gcc,Makefile,make,makefile,linux,test
来源: https://blog.csdn.net/weixin_46098612/article/details/122485063

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有