IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux-make -> 正文阅读

[系统运维]Linux-make

简介

  • make,即make工程管理器
  • Linux下的管理编译的工具(编译好了=代码可以运行了=工程管理好了)
    • Linux没有IDE(集成开发环境)用于代码编写编译和运行
    • 直接拿着gcc搞有点难受,相当于用 make+Makefile 封装了一下
  • 通过读入 Makefile文件(规则),执行编译工作
    • make命令是就是执行这个文件里的语句
    • make 可以理解成一种编程语言(python .py)
  • 优点
    • 对于维护一些具有相互依赖关系的文件特别有用(自动关联)
    • 自动确定需要重新编译的文件,不做无用功,提高效率
    • 起初适用于C语言,但只要提供相应的编译器,mM可以满足你的所有幻想(管理编译器的工具)

机制

  • make命令参数
    1- Makefile语法格式
    target:relys
    	 command
    	 ...
    
    # target 目标文件,多个文件的话以空格分开
    # relys 生成目标所依赖的文件
    # command 命令行,这里的命令和/bin/bash类似,很多也是直接交给shell执行,所以...
    # command可以跟人rely后使用分号隔开,也可以换行+Tab(必须用Tab!!!)
    # 一行太长都可以用 \ 换行
    
  • 程序片段,说明语法
    all : main.o keys.o
    	gcc main.o -o all	# 使用gcc编译,生成all文件,必须Tab
    	
    # 可以使用通配符 * ? [...]
    clean : 
    	rm -f *.o	# 删除所有当前的.o文件
    	
    # 这里的clean是伪目标,后面没有依赖并不会直接生成clean文件
    # 为了防止和目标文件重名,可以
    .PHONY : clean
    # 为目标特性:总是被执行,所以比较新,如下:
    all : p1 p2 p3
    .PHONY : all
    p1 :  xxx
    	xxx
    p2 : ...	# 这里all被定义为伪目标,每次重新编译会被执行而且最新,所以后面的依赖也会重新编译!
    
    # 赋值
    objects = *.o	# 这里是单纯的将 *.o 给变量,不展开
    # 如果要展开
    objects := $(wildcard *.o)	# 这样赋值; wildcard是mk的关键字
    
    # make 会按顺序执行Mf中的文件
    # 如果要让上一条命令的结果应用于下一条,必须使用分号
    exec :
    	cd /home/dev
    	pwd		# 这里显示的还是Mf所在的目录
    # 应该这样
    exec :
    	- cd /home/dev; pwd		# 有点像管道
    # - 作用是不管是否出错都认为是成功的,不中断执行
    

变量

  • 命名规则和其他语言类似,但是可以数字开头
  • 声明变量必须赋初值,使用时需要加上$符号,可以使用()/{}括起来
    objects = main.o test.o fun.o
    program : $(objects)
    	cc -o p1 ${objects}
    
  • 如果以:=赋值,代表只能使用之前声明的变量
    y := ${x}bar
    x := foo
    all : 
    	echo ${y}	# 输出的是bar,而不是foobar
    
  • 类似的,?= 表示如果之前有这个变量就啥也不做,如果没有就按现在这么定义
    foo ?= hello.o		# 相当于带了条件判断语句
    
  • 使用 += 追加
    objects = main.o test.o
    objects += hello.o
    # 会继承之前的赋值操作符,例如之前使用 := ,加上之后就还是 :=
    

函数

  • 格式;这里都是调用,没说定义
    $(func_name arg1,arg2,arg3...)	# 也可以是 {},不同 参数都要逗号隔开的
    
  • 字符串替换函数
    $(subst <from>, <to>, <text>)	# 将text中的from替换成to,返回被替换的字符串
    
  • 查找字符串函数
    $(findstring <find>, <in>)	# 在字符串in中查找find
    
  • 过滤函数
    $(filter <pattern>, <text>)	# 过滤出符合pattern规则的字符串
    # 例子
    foo := main.c test.c hello.s fuck.h
    source : $(foo)
    	cc $(filter %.c %.s, $(foo)) -o source	# 要用()就都用()
    
    • filter-out函数返回去除掉符合pattern的字符串
  • 排序函数
    $(sort <list>)	# 按字母排序list中的元素
    
  • 取单词函数
    $(word <n>, <text>)	# 取text中第n个单词
    
    # 取单词串
    $(wordlist <s>,<e>,<text>)	# 取出text中从s个到e个的单词,单词计数都是从1开始
    
    # 单词个数统计函数
    $(words <text>)
    
    # 取首单词函数
    $(firstword <text>)
    
  • 取目录函数
    $(dir <dirs>)
    # 例子
    $(dir /usr/local/bin/nginx hello.c)	# /usr/local/bin ./	hello是当前目录下的,所以返回./
    
    # 取文件名函数
    $(notdir <names>)
    # 例子
    $(dir /usr/local/bin/nginx, hello.c)	# nginx hello.c
    
    # 取后缀名函数
    $(suffix <names>)	# 如果文件没有后缀名返回空字符
    
    # 取前缀函数
    # 例子
    $(basename usr/local/bin/nginx hello.c /etc/yum.repo.d)	# usr/local/bin/nginx hello /etc/yum.repo
    
    • 类似的,有加后缀加前缀函数
  • 循环函数
    names := a,b,c,d
    files := $(foreach i, $(names), $(i).c)	# 得到a.c b.c c.c d.c
    # 类似python的for i in some,这里将表达式直接放到最后而已
    
  • 条件判断函数
    # 格式
    $(if <condition>, <then-part>, <else-part>)	# 只有一个part会被执行
    

隐式规则

  • 学习地址
  • 隐式规则变量
  • 自动化变量
    • $@ 规则中所有目标文件(targets)的集合

小结

  • make是管理编译器的语言,使用该语言编写Makefile文件,即可按规则编译,得到需要的目标文件(可执行文件)
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:20:10  更:2021-10-22 11:20:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:37:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码