Makefile语法详解

news2024/9/19 14:53:31

目录

  • 1 Makefile基本常识
    • 1.1 基本格式
    • 1.2 makefile规则
    • 1.3 伪目标
    • 1.4 变量的使用
    • 1.5 赋值方式
    • 1.6 常用函数
  • 2 Makefile整体编译
    • 2.1 编译选项
    • 2.2三个.c整体编译
    • 2.3 静态库编译
    • 2.4 动态库编译

1 Makefile基本常识

1.1 基本格式

如下所示为Makefile的基本格式,特别需要注意的是不能随意加空格等符号,比如tab键前后
在这里插入图片描述
以下makefile语句执行make debug即可,我们通常使用这个方式进行查看某个变量是否与预期一致,比如$echo $(HOST_ARCH)。

#方法一
debug :
	echo hello		#打印hello,同时也会打印echo hello这句话的执行过程
#方法二
debug :
	&echo hello		#加入&之后不打印执行过程

1.2 makefile规则

在这里插入图片描述

1.3 伪目标

为了避免与文件名重名,如下所示,我们常采用伪目标的形式将clean修饰一下,目的是即使有一个同名的文件名,他也会执行makefile中的clean命令。

clean :
	@rm -rf *.o

.PHONY :clean bebug #可以同时声明多个伪目标文件

1.4 变量的使用

变量使用 := 来定义,符号两边要留一个空格,变量的引用使用 {} 或者 () ,前面加一个符合$,具体使用方法如下图所示,通过make compile命令可以生成main.o文件。
在这里插入图片描述

  • $@:目标target的完整名称
  • $<:第一个依赖文件的名称
  • $^:所有依赖文件的名称

除上面这种表达方式外,我们还可以使用预定义变量,来替换对于的文件名,具体使用方法如下。
在这里插入图片描述

1.5 赋值方式

  • = 直接赋值给变量,但是后面再次对它进行赋值时该变量会改变为新的值,该方法一般用于在同一个项目上需要不同的架构上进行编译。
    在这里插入图片描述
  • := 立即赋值运算符,第一次设置完之后以后再次赋值也不会发生改变。
    在这里插入图片描述
  • ?= 如果前面已经定义了,则不重新赋值,如果前面还没有定义,则将此变量定义为新值。
    在这里插入图片描述
  • += 在该变量的后面继续赋值
    在这里插入图片描述
  • \ 将同一行换成多行,跟C语言用法一样,仅仅是提高观感
    在这里插入图片描述

1.6 常用函数

  • shell 利用linux中的shell脚本来得到对应的信息
    在这里插入图片描述
  • subst 将字符串中的某个字串换成另外一个字串
    在这里插入图片描述
  • patsubst 是subst的升级版,可以直接使用%通配符更换自己想更换的某个字串。
    在这里插入图片描述
    以下是两个函数的对比,比如我们想把./src/ ***.cpp更改为./objs/ ***.o
#方法一
cpp_srcs := $(shell find src -name *cpp)
cpp_objs := $(subst src/,objs/,$(cpp_srcs))
cpp_objs := $(subst .cpp,.o,$(cpp_objs))  #此处不太理解为啥可以用:=,不应该该一个变量名么
#方法二
cpp_srcs := $(shell find src -name *cpp)
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))
  • wildcard 扩展通配符,获取工作目录下的所有符合规则的文件列表,
#在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件
src=$(wildcard *.c ./sub/*.c)
@echo $(src)
#输出为a.c b.c ./sub/sa.c ./sub/sb.c
  • foreach 用循环把list中每个元素取出来放在var中,之后执行text表达式
    在这里插入图片描述
    以下是两种具体的实现方法
dir :=	/111/111 \
		/222/222
#方法一:
dir := $(foreach a ,$(dir), -I $(a))
#方法二:
dir := $(dir:%=-I %)
debug :
	@echo $(dir)
  • dir 从文件名序列中提取出文件夹的路径,可以通过以下函数执行
@mkdir -p $(dir src/foo.c)  #此处-p最好加上,不加上的话如果文件已经存在就会报错。

在这里插入图片描述

  • notdir 将文件路径的路径给去掉,只留下文件名
    在这里插入图片描述
  • filter 在notdir的基础上,在筛选一次,只留下后缀为自己设置的文件的文件名
    在这里插入图片描述
  • filter-out 去除掉某一项,如下所示,去掉src中的mian.cpp,其他的cpp保留。
libs := $(filer-out src/main.cpp,$(sheel find src -name *.cpp))
  • basename 去掉对应文件名的后缀
    在这里插入图片描述

2 Makefile整体编译

2.1 编译选项

常见的编译选项主要是以下几种,我们在使用-c编译成.o文件是需要指定其中的某些信息,特别是在包含头文件的时候需要导入头文件的库位置信息。
在这里插入图片描述

2.2三个.c整体编译

cpp.srcs是源文件目录
include_paths是头文件目录
cpp_objs是要生成的.o文件目录
workspace是可执行文件目录
compile_options是添加编译条件
在这里插入图片描述
在这里插入图片描述

2.3 静态库编译

下面是一个例程,第一个图是对应的文件信息,我们需要在main.cpp中调用另外两个文件里面的函数。在下面这个历程中,我们需要先编译出对应的.a文件静态库,然后在去编译生成可执行文件。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2.4 动态库编译

动态库与静态库的区别,静态库是直接生成所有的.c文件的库文件,占用内存大,而动态库是需要什么编译什么
在这里插入图片描述
下面这个是对应的文件情况:
在这里插入图片描述
下面这个是对应的makefile动态编译文件,直接执行run即可动态编译出最终的可执行文件。最后一个run直接依赖前面两个过程.o文件的生成和.so动态库的生成。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高等数学 2.5 函数的微分

文章目录 一、微分的定义二、微分的几何意义三、微分运算1、函数和、差、积、商的微分法则2、复合函数的微分法则 四、微分在近似计算中的应用 一、微分的定义 定义 设函数 y f ( x ) y f(x) yf(x) 在某区间内有定义&#xff0c; x 0 x_0 x0​ 及 x 0 Δ x x_0 \Delta x …

大模型时代:普通人如何获利

随着人工智能技术的飞速发展&#xff0c;我们正步入一个以大模型为驱动力的新时代。这些大型语言模型&#xff0c;如GPT-3和BERT&#xff0c;已经在各个领域展现出惊人的能力&#xff0c;包括文本生成、翻译、问答等。这些技术的进步不仅改变了我们的生活&#xff0c;也为普通人…

【数据结构初阶】顺序结构二叉树(堆)接口实现超详解

文章目录 1.树1. 1 树的概念与结构1. 2 树的相关术语1. 3 树的表示1. 4 树形结构实际运用场景 2.二叉树2. 1 概念与结构2. 2 特殊的二叉树2. 2. 1 满二叉树2. 2. 2 完全二叉树 2. 3 二叉树存储结构2. 3. 1 顺序结构2. 3. 2 链式结构 3. 实现顺序结构二叉树&#xff08;小堆&…

【OJ刷题】双指针问题6

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

ThreadX源码:Cortex-A7的tx_thread_irq_nesting_start(嵌套中断开始动作).s汇编代码分析

0 参考资料 Cortex M3权威指南(中文).pdf&#xff08;可以参考ARM指令集用法&#xff09; 1 前言 tx_thread_irq_nesting_start.s是用来实现Cortex-A7 IRQ嵌套中断的开始函数实现的汇编文件。 2 源码分析 源码如下&#xff1a; &#xff11;  IRQ_DISABLE 0x80…

遍历指定的目录a中的所有子目录及所有文件os.walk(root_dir)

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 遍历指定的目录a 中的所有子目录 及所有文件 os.walk(root_dir) [太阳]选择题 已知已经存在的目录和文件情况如下&#xff1a; a目录下有子目录b&#xff0c;有两个文件&#xff1a;a1.txt和…

Flet全平台开发:软件开发界勇士为Python语言补短板的一次极具挑战性的尝试、冲刺和华丽亮相

一、Flet创始人和开发者介绍、开发Flet的背景介绍 Flet 的创始人和开发者 Feodor Fitsner 是俄罗斯人&#xff0c;就职于微软。 Flet 的第一个版本于 2022 年 6 月发布。这是一个相对较新的库&#xff0c;它基于 Flutter 框架&#xff0c;首先支持的是用 Python 语言开发软件…

2024/9/17 pytorch-卷积神经网络

一、torch.nn pytorch有很多接口&#xff0c;其中的torch.nn可以让我们方便的调用以便生成神经网络各层 1.torch.nn.Module 是一个构成神经网络层的一个基本类别&#xff0c;一般生成一个类别来继承nn.module torch.tensor(a)将a初始化为一个tensor类型数据 一般这种已经固…

攻防世界--->hackme

学习笔记。 下载 查壳。 64ida打开。 进入main&#xff1a; 跟进&#xff1a; 这是密文 咋一看这程序感觉很复杂&#xff0c;很复杂&#xff1a; 脚本&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h>int main() {unsigned char …

Qt --- 信号和信号槽

前言 Linux信号Signal&#xff0c;系统内部的通知机制&#xff0c;进程间通信方式。 信号源&#xff1a;谁发的信号。 信号的类型&#xff1a;哪种类别的信号。 信号的处理方式&#xff1a;注册信号处理函数&#xff0c;在信号被触发的时候自动调用执行。 Qt中的信号和Lin…

Bugku---密码学---乐谱密码

题目出处&#xff1a;首页 - Bugku CTF ✨打开后发现是一张乐符图 ✨一般我们所熟悉的「Do Re Mi Fa Sol La Si」&#xff0c;若写成音名&#xff0c;即是「C D E F G A B」。不过德国人习惯使用的音名则是「C D E F G A H」&#xff0c;「B」代表 音名B♭ 。 C也就是后面的4&…

Rust练手项目,写个有趣的小工具定时从一言网获取一段有趣的话并推送通知

Rust练手项目&#xff0c;写个有趣的小工具 代码 继续练习Rust, 写个小工具定时从一言网获取一段有趣的话并提示&#xff0c;如下 练习以下Rust点 并发编程 Mutex, Arc指针使用HTTP请求Windows Gui 代码 Cargo.toml [package] name "funny_word" edition "20…

YOLOv8目标检测模型——遥感小目标检测经验分享

小目标检测——YOLOV8 一、引言 背景介绍 &#xff08;1&#xff09;目标检测的重要性 目标检测在许多领域都具有极其重要的作用。在自动驾驶中&#xff0c;目标检测能够识别道路上的障碍物和行人&#xff0c;确保行车安全。在视频监控中&#xff0c;目标检测能够实时发现异…

【matlab】生成 GIF 的函数(已封装可直接调用)

文章目录 前言一、函数输入与输出二、函数代码三、例程&#xff08;可直接运行&#xff09;参考文献 前言 生成 gif 图片时遇到的问题&#xff0c;为了后续调用方便&#xff0c;封装为函数 一、函数输入与输出 输入&#xff1a; cell_figure: cell 数组&#xff0c;数组元素是…

Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用增强版

前言 之前使用Chainlit集成LlamaIndex并使用通义千问大语言模型的API接口&#xff0c;实现一个基于文档文档的网页对话应用。 可以点击我的上一篇文章《Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用》 查看。 本次针对上一次的代码功能进一步的完善…

Cursor与Copilot:编程界的双雄对决

引子 在技术快速发展的当下&#xff0c;编程几乎成为了现代社会的基础能力。Cursor与Copilot作为当前备受瞩目的编程助手&#xff0c;各自展现出了独特的魅力。它们不仅改变了程序员的工作方式&#xff0c;更是提升了代码编写的效率&#xff0c;成为了编程界的“双雄”。 Curs…

软件安全、逆向分析、加密与解密--crackme2详解

本次使用到的软件有&#xff1a;PEiD、IDA、X32dbg 刚学逆向不久&#xff0c;可能有些地方会有错误&#xff0c;欢迎各位大佬指导 执行 运行程序 点击About 点击确定&#xff0c;输入如图数据 点击try Now 点击确定&#xff0c;回到主界面 点击Exit&#xff0c;退出 查壳&a…

Docker:SpringBoot项目创建Docker镜像并推送到阿里云容器镜像仓库

0. 准备工作 os&#xff1a;macos 15.0 jdk&#xff1a;1.8 docker&#xff1a;26.0.0 1. 阿里云容器镜像服务创建实例 创建个人版 个人实例创建成功 个人镜像加速器地址 2. 安装Docker Desktop Docker Desktop是Docker的一个集成工具&#xff0c;非必须&#xff0c;过程…

指纹与指甲检测系统源码分享

指纹与指甲检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

这个时代唯一“不变“的又是{变}

这个时代唯一不变的就是“变”&#xff0c;所以每个人都得有规划意识&#xff0c;首先要对自己的价值有清晰的认知&#xff0c;你核心卖点是什么。第二&#xff0c;你取得的成绩是通过平台成就的还是通过自身努力取得的&#xff0c;很多人在一家平台待久了之后&#xff0c;身上…