Linux学习6--Makefile
2022/3/7 7:20:12
本文主要是介绍Linux学习6--Makefile,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Linux学习6--Makefile
- 一、Makefile
- 1、Make简介
- 2、Makefile基本结构
- 二、Makefile变量
- 1、创建和使用变量
- 三、Make的用法
- 1、Make使用
- 2、Makefile的隐含规则
- 四、VPATH的用法
一、Makefile
1、Make简介
(1)工程管理器,顾名思义,是指管理较多的文件 (2)Make工程管理器也就是个“自动编译管理器”。 这里的“自动”是指它能够根据文件时间戳, 自动发现更新过的文件而减少编译的工作量, 同时,它通过读入Makefile文件的内容来执行大量的编译工作 (3)Make将只编译改动的代码文件,而不用完全编译。
2、Makefile基本结构
Makefile
是Make
读入的唯一配置文件。
- 由
make
工具创建的目标体
(target),通常是目标文件
或可执行文件
- 要创建的目标体
所依赖的文件
(dependency_file) - 创建每个目标体时需要
运行的命令
(command)
注意:命令行前面必须是一个”TAB键”,否则编译错误为:*** missing separator. Stop.
Makefile格式
:
target : dependency_files <TAB> command 例子 hello.o : hello.c hello.h gcc –c hello.c –o hello.o
二、Makefile变量
1、创建和使用变量
(1)创建变量的目的
用来代替一个文本字符串,字符串
可以是:
系列文件的名字 传递给编译器的参数 需要运行的程序 需要查找源代码的目录 你需要输出信息的目录 你想做的其它事情
(2) 变量定义的两种方式
递归展开方式 VAR=var 简单方式 VAR:=var
变量使用: $ (VAR)
如果要使用” $
”则用”$$
”来表示。
变量
类似于编程语言中的宏。
例子:
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g sunq : $(OBJS) $(CC) $(OBJS) -o sunq kang.o : kang.c kang.h $(CC) $(CFLAGS) -c kang.c -o kang.o yul.o : yul.c yul.h $(CC) $(CFLAGS) -c yul.c -o yul.o
(3)用?=定义变量
dir := /foo/bar FOO ?= bar FOO是?
含义是,如果FOO没有被定义过,那么变量FOO的值就是bar
,如果FOO先前被定义过,那么这条语将什么也不做。
(4)变量添加值
你可以通过+=
为已定义的变量添加新的值
例如:
Main=hello.o hello-1.o Main+=hello-2.o
(5)默认变量
AR: 库文件维护程序的名称,默认值为ar。AS汇编程序的名称,默认值为as。 CC: C编译器的名称,默认值为cc。CPP C预编译器的名称,默认值为$(CC) –E。 CXX: C++编译器的名称,默认值为g++。 FC: FORTRAN编译器的名称,默认值为f77 RM: 文件删除程序的名称,默认值为rm -f
例如:
Hello: main.c main.h <tab> $(CC) –o hello main.c clean: <tab> $(RM) hello
(6)预定义变量
ARFLAGS 库文件维护程序的选项,无默认值。 ASFLAGS 汇编程序的选项,无默认值。 CFLAGS C编译器的选项,无默认值。 CPPFLAGS C预编译的选项,无默认值。 CXXFLAGS C++编译器的选项,无默认值。 FFLAGS FORTRAN编译器的选项,无默认值。
例如:
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g sunq : $(OBJS) $(CC) $(OBJS) -o sunq kang.o : kang.c kang.h $(CC) $(CFLAGS) -c kang.c -o kang.o yul.o : yul.c yul.h $(CC) $(CFLAGS) -c yul.c -o yul.o
(7)自动变量
$*
不包含扩展名的目标文件名称
$+
所有的依赖文件
,以空格分开,并以出现的先后为序,可能包含重复的依赖文件$<
第一个
依赖文件的名称$?
所有时间戳比目标文件晚的的依赖文件,并以空格分开$@
目标文件
的完整名称$^
所有
不重复的目标依赖文件,以空格分开$%
如果目标是归档成员
,则该变量表示目标的归档成员名称
例如
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g sunq : $(OBJS) $(CC) $^ -o $@ kang.o : kang.c kang.h $(CC) $(CFLAGS) -c $< -o $@ yul.o : yul.c yul.h $(CC) $(CFLAGS) -c $< -o $@
备注:make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。
如果用户在Makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量
三、Make的用法
1、Make使用
直接运行make
选项 -C dir读入指定目录下的Makefile -f file读入当前目录下的file文件作为Makefile -i忽略所有的命令执行错误 -I dir指定被包含的Makefile所在目录 -n只打印要执行的命令,但不执行这些命令 -p显示make变量数据库和隐含规则 -s在执行命令时不显示命令 -w如果make在执行过程中改变目录,打印当前目录名
2、Makefile的隐含规则
隐含规则1:编译C程序的隐含规则
“<n>.o”的目标依赖目标会自动推导为“<n>.c” 并且其自动生成命令是“$(CC) -c $(CPPFLAGS) $(CFLAGS)”
隐含规则2:链接Object恩建的隐含规则
“<n>”目标依赖于“<n>.o”, 通过运行C的编译器来运行链接程序生成(一般是“ld”), 其自动生成命令是:“$(CC) $(LDFLAGS) <n>.o” “$(LOADLIBES) $(LDLIBS)”,这个规则对于只有一个源文件的工程有效,同时也对多个Object文件(由不同的源文件生成)的也有效
例如如下:
x:x.o y.o z.o 并且“x.c”、“y.c”和“z.c”都存在时,隐含规则将自动执行如下命令: cc -c x.c -o x.o cc -c y.c -o y.o cc -c z.c -o z.o cc x.o y.o z.o -o x
四、VPATH的用法
VPATH:虚路径
(1)在一些大的工程中,有大量的源文件. 我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。 所以,当make需要去寻找文件的依赖关系,你可以在文件 前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。 (2)Makefile文件中的特殊变量“VPTH”就是文成这个功能的. 如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。 如果定义了这个变量,那么make就会在当前 目录找不到的情况下,到所指定的目录中去找寻文件了。 (3) VPATH = src:../headers (4) 上面的定义指定两个目录,“src”和“../headers”, make会按照这个顺序进行搜索。 目录由“冒号”分隔。当然,当目前目录永远是最高的优先搜索的地方
到这里就结束啦~
这篇关于Linux学习6--Makefile的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法