当前位置: 首页 > news >正文

Makefile 语法

Makefile文件用于管理和组织代码工程的编译和链接,需要被make工具解析并完成相关的动作。
1、文件包含:
·语法:include 文件名
·作用:将其它makefile文件包含进来,组成一个更大的makefile文件,这样有利于makefile模块化编程。通常我们将一些配置选项分开成一个独立的makefile文件,这样有利于makefile文件的管理;或将模块代码的依赖关系和需要编译的文件信息独自写到一个 makefile文件中,最终通过include命令形成一个顶层makefile文件来完成整个工程代码的编译和链接。
2、变量定义:
·语法:变量名 := 变量值
·在makefile中,经常需先定义一个变量,然后往该变量中追加新的值(通过+=符号)。
·例如:先定义一个C_SRCS变量(该值可以为空),然后将代码文件test1.c和test2.c添加到C_SRCS中
C_SRCS :=
C_SRCS += test1.c test2.c
·在makefile中有一类特殊的变量,其名称为自动变量,自动变量的值会依据规则中的target(目标) 和 prerequisites(前提)自动计算其值,自动变量一般以开头$为起始,下面将列出一些常见的自动变量:
$@为规则中的target名称
< 为规则中第一个 p r e r e q u i s i t e s 名称 3 、内置命令: ⋅ M a k e f i l e 中内置了一些常用的命令,有字符串处理函数 s u b s t 、 p a t s u b s t 、 s t r i p 、 f i n d s t r i n g 、 f i l t e r 、 f i l t e r − o u t 、 s o r t 、 w o r d 、 w o r d l i s t 、 w o r d s 、 f i r s t w o r d 、 l a s t w o r d ;文件名处理函数 d i r 、 n o t d i r 、 s u f f i x 、 b a s e n a m e 、 a d d s u f f i x 、 a d d p r e f i x 、 j o i n 、 w i l d c a r d 、 r e a l p a t h 、 a b s p a t h ;条件处理函数 i f ;循环处理函数 f o r e a c h 等。 ⋅ 常见的函数: w i l d c a r d 函数:其语法为 <为规则中第一个prerequisites名称 3、内置命令: · Makefile中内置了一些常用的命令,有字符串处理函数subst、patsubst、strip、findstring、filter、filter-out、sort、word、wordlist、words、firstword、lastword;文件名处理函数dir、notdir、suffix、basename、addsuffix、addprefix、join、wildcard、realpath、abspath;条件处理函数if;循环处理函数foreach等。 ·常见的函数: wildcard 函数:其语法为 <为规则中第一个prerequisites名称3、内置命令:Makefile中内置了一些常用的命令,有字符串处理函数substpatsubststripfindstringfilterfilteroutsortwordwordlistwordsfirstwordlastword;文件名处理函数dirnotdirsuffixbasenameaddsuffixaddprefixjoinwildcardrealpathabspath;条件处理函数if;循环处理函数foreach等。常见的函数:wildcard函数:其语法为(wildcard pattern),pattern为匹配的模式,比如 ( w i l d c a r d f o r e a c h 函数:其语法为 (wildcard %.c) 为查找当前路径下面文件名以.c结尾的文件。 foreach 函数:其语法为 (wildcardforeach函数:其语法为(foreach var,list,text),每循环一次var从list中按顺序取值一个,然后执行一次text代码并记录结果,最终返回所用text代码运行的结果。
dirs := C_DIR S_DIR
file := ( f o r e a c h d i r , (foreach dir, (foreachdir,(dirs),$(wildcard ( d i r ) / ∗ ) ) 将 C D I R 和 S D I R 文件夹下面的所有文件添加到 f i l e 变量中。 d i r 函数:其语法为 (dir)/*)) 将C_DIR和S_DIR文件夹下面的所有文件添加到file变量中。 dir 函数:其语法为 (dir)/))CDIRSDIR文件夹下面的所有文件添加到file变量中。dir函数:其语法为(dir names…),用于获取names中文件夹路径,比
( d i r s r c / f o o . c h a c k s ) 将获得文件夹路径 s r c / . / n o t d i r 函数:其语法为 (dir src/foo.c hacks) 将获得文件夹路径 src/ ./ notdir 函数:其语法为 (dirsrc/foo.chacks)将获得文件夹路径src/./notdir函数:其语法为(notdir names…),用于获取names中除去路径的信息
( n o t d i r s r c / f o o . c h a c k s ) 将获得文件信息 f o o . c h a c k s b a s e n a m e 函数:其语法为 (notdir src/foo.c hacks) 将获得文件信息 foo.c hacks  basename 函数:其语法为 (notdirsrc/foo.chacks)将获得文件信息foo.chacks basename函数:其语法为(basename names…),用于获取names中除去后缀信息
( b a s e n a m e s r c / f o o . c s r c − 1.0 / b a r h a c k s ) 将获得信息 s r c / f o o s r c − 1.0 / b a r h a c k s a d d s u f f i x 函数:其语法为 (basename src/foo.c src-1.0/bar hacks) 将获得信息 src/foo src-1.0/bar hacks addsuffix 函数:其语法为 (basenamesrc/foo.csrc1.0/barhacks)将获得信息src/foosrc1.0/barhacksaddsuffix函数:其语法为(addsuffix suffix,names…),用于往names中添加后缀信息suffix
( a d d s u f f i x . c , f o o b a r ) 将获得文件信息 f o o . c b a r . c a d d p r e f i x 函数:其语法为 (addsuffix .c,foo bar) 将获得文件信息 foo.c bar.c addprefix 函数:其语法为 (addsuffix.c,foobar)将获得文件信息foo.cbar.caddprefix函数:其语法为(addprefix prefix,names…),用于往names中添加前缀信息prefix
( a d d p r e f i x s r c / , f o o b a r ) 将获得信息 s r c / f o o s r c / b a r p a t s u b s t 函数:其语法为 (addprefix src/,foo bar) 将获得信息src/foo src/bar  patsubst 函数:其语法为 (addprefixsrc/,foobar)将获得信息src/foosrc/bar patsubst函数:其语法为(patsubst pattern,replacement,text),根据 pattern信息将text替换成replacement
objects = foo.o bar.o baz.o
files = ( p a t s u b s t (patsubst %.o,%.c, (patsubst( objects))
将获得信息 foo.c bar.c baz.c
其可以简单写成
objects = foo.o bar.o baz.o
files = $(objects:.o=.c)
4、规则定义:
·规则是makefile中最重要的概念,其告诉make 目标文件的依赖关系,以及如何生成及更新这些目标文件。在makefile文件规则有2种,一种是显式规则,另一种是隐式规则。
·显式规则用于说明 何时及如何重新生成目标,其列出了目标依赖的文件信息,并通过调用命令来创建或更新目标,其语法一般为:
targets : prerequisites
        recipe
        …
targets为要生成或更新的目标,prerequisites为目标依赖的关系,recipe为生成目标的命令,一个规则可以有多条recipe;
foo.o : foo.c defs.h
        cc -c -g foo.c
其中foo.o为target,foo.c defs.h 为prerequisites,cc -c -g foo.c为recipe。
·隐式规则用于说明 何时及如何根据其名称来重新生成一类目标文件,其描述了目标是如何依赖于名称相似的文件(一般来说除去后缀信息,其目标与依赖文件的名称是一样的),并调用命令来创建或更新目标;
%.o : %.c
        $(CC) -c $(CFLAGS) $< -o @ 这个隐式规则说明了 . o 的目标文件依赖于同名的 . c 文件,其中 @ 这个隐式规则说明了.o的目标文件依赖于同名的.c文件,其中 @这个隐式规则说明了.o的目标文件依赖于同名的.c文件,其中< 及 @ 为自动变量, @为自动变量, @为自动变量,<为第一个prerequisites条件,也就是 目标名称.c,$@为目标,也就是 目标名称.o。 $(CC) -c $(CFLAGS) %.c -o %.o
·在makefile中,我们通常要编写3种隐式规则,第1种为代码链接规则,第2种为源代码编译规则,第3种为汇编代码编译规则。
5、文件搜索路径设置:
·Make命令默认会在当前路径中搜索prerequisites中的文件,比如头文件,但我们在写程序时,经常将头文件和源文件隔开放在不同的文件夹下,这种该怎么处理呢?1、我们可以通过VPATH变量来解决,2、我们可以通过vpath指令来解决。
·VPATH变量:VPATH变量为所有的prerequisites指定文件路径,路径之间可以通过 : 或 空格 隔开
VPATH = src:…/headers
其代表在src文件或者上层的headers文件中查找。
 ·vpath指令:vpath指令的作用与变量VPATH的作用差不多,但vpath有更多的灵活性,其语法为:vpath pattern directories
  pattern为需要查找的文件匹配模式信息,directories为要查找的文件路径;
vpath %.h …/headers
其代表在上一层文件夹headers中查找 .h头文件信息。
6、依赖关系生成:
在编写c文件代码时,我们经常通过#include 语句来包含其它文件信息,比如头文件,该c文件被编译时需要依赖于其#include包含进来的文件,在规则编写中,就需要指出这个依赖关系,这样当头文件信息改变后,make程序就知道如何更新目标文件了,而不是整个进行重编译,但这个操作可以看出是非常消耗时间及傻瓜式的,作为解决方案我们可以通过使用 编译器命令 –M选项来自动完成该工作,比如在main.c中#include “defs.h”,通过 cc –M main.c将产生输出 main.o:main.c defs.h,我们可以将输出结果写到 .d文件中,然后通过include指令包含到makefile文件中。
7、编译器常用命令选项:
  编译器通常进行预处理、编译、汇编和链接处理,预处理包含了宏定义、文件包含、条件编译,编译则直接将代码翻译成机器码,汇编则将汇编代码翻译成机器码,链接则按照内存地址分配文件将各个文件的机器码统一形成一个可执行文件,对编译命令(比如gcc)而言该如何区别这些操作呢?即通过命令选项。下面将介绍一些常见的命令选项:
-o file 输出生成的 file文件
-c 编译或汇编程序文件,但不会执行链接操作
-mcpu=name 规定目标处理器的型号
-Wall 使能所有警告调试信息输出
-glevel 要求带调试信息的等级,-g0代表不产生调试信息,-g1代表产生最小的调试信息用来跟踪程序的运行,但不包括本地变量,-g3包含了一些额外的调试信息比如程序的宏定义等。
-I dir 增加头文件的搜索路径,比如 –I…/header
-D name 预先定义一个宏定义

相关文章:

Makefile 语法

Makefile文件用于管理和组织代码工程的编译和链接&#xff0c;需要被make工具解析并完成相关的动作。 1、文件包含&#xff1a; 语法&#xff1a;include 文件名 作用&#xff1a;将其它makefile文件包含进来&#xff0c;组成一个更大的makefile文件&#xff0c;这样有利于make…...

【运维项目经历|039】Ceph高性能云存储集群部署与优化

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社区:CSDN云计算交流社区欢迎您的加入! 目录 项目名称 项目背景 项目目标 项目成果…...

算法刷题之哈希表

知识点 常见的哈希结构&#xff1a;数组、set、map // 创建并初始化 unordered_set unordered_set<int> set {1, 2, 3, 4, 5};// 插入新元素 set.insert(6);// 检查元素是否存在 if (set.find(3) ! set.end()) {cout << "3 is in the set" << e…...

【linux】linux中定时任务的巧妙运用,让你轻松解放双手

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

【复旦微FM33 MCU 外设开发指南】系统篇——时钟

前言 本系列基于复旦微FM33系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转↓↓↓ 【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/08/04 文章目录 前言时钟源…...

Android Graphics 显示系统 - 计算FPS的原理与探秘Present Fence

“ 最近忙着新房子装修的事情&#xff0c;这篇计划内的文章拖了好久一直没有足够的时间来写作&#xff0c;终于挤出些儿时间来继续研究学习了。” 整了四个晚上终于拼凑出一篇文章&#xff0c;虽说是讲FPS计算原理&#xff0c;但该文涉及的知识点还是蛮多的&#xff0c;特别是对…...

图论:1857. 有向图中最大颜色值(拓扑排序+动态规划)

文章目录 1.问题分析2.代码解析2.1 代码步骤1. 初始化数据结构2. 构建图和入度数组3. 初始化队列4. 拓扑排序和动态规划5. 检查是否存在环并返回结果 3. 问题扩展1. 最长路径问题&#xff08;DAG&#xff09;2. 最短路径问题&#xff08;DAG&#xff09;3. 最大路径和问题4. 路…...

pytorch学习笔记3 tensor索引和切片

dim 0 占先 切片 &#xff08;前N或者后N个&#xff09; &#xff1a;2 表示 0到2&#xff08;不包含2&#xff09;&#xff0c; 1&#xff1a;表示 1到末尾&#xff0c; -1表示最后一个元素&#xff0c;-2表示倒数第二个 0:28:2 表示从0到27隔点采样 &#xff1a;&#xff…...

学习记录——day23 多进程编程

目录 一、多进程引入 1.1、引入目的 1.2、进程的概念 1.3、进程的种类 1.4、进程号的概念 1.5、特殊进程 0号 1号 2号 孤儿 僵尸 1.6、进程的相关命令 1&#xff09;查看进程信息的命令&#xff1a;ps 跟不同的选项&#xff0c;执行不同的状态 2&am…...

英特尔股市暴跌,财报亏损 | HuggingFace 实现盈利 |iOS18 Beta 苹果AI

写在前面 了解一下最近科技圈发生的一些事情 英特尔 硬件巨头英特尔宣布裁掉1.5w个岗位&#xff0c;约占英特尔员工的12%&#xff0c;非常的夸张。本次裁员可能是由于前段时间英特尔的i7&#xff0c;i9的13/14代处理器的暴雷&#xff0c;导致英特尔Q2的财报低迷。 今年以来…...

C++入门基础(二)

6. 引用&#xff08;引用就是取别名&#xff09; 6.1 引用的概念和定义 引用不是新定义一个变量&#xff0c;而是给已存在变量取了⼀个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。比如&#xff1a;水浒传中李逵&…...

fabricjs 实现图像的二值化功能

一、效果图 二、图像二值化的作用 二值化是图像处理中常用的一种方法&#xff0c;其作用是将灰度图像转换为二值图像&#xff0c;即将图像中的像素点根据其灰度值分成两类&#xff1a;黑色和白色。这种处理方法可以帮助我们更清晰地识别图像中的目标&#xff0c;简化图像的复杂…...

修改本地hosts文件及外部访问机器本地hosts文件后,rancher UI网站仍然不能访问

原因排查 kubectl get svc # 输出&#xff1a; NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d17hkubectl get svc -A # 输出&#xff1a; NAMESPACE …...

西北潮榆林范儿,新榆林首个360°沉浸式剧场发布会闪耀亮相

这是一场城市更迭的未来大赏&#xff0c;也是一场商业蝶变的复合对话 8月3日&#xff0c;朗阁集团商业品牌发布会在榆林银杏熙悦酒店隆重启幕。朗阁集团董事长杨志成携众多集团领导出席&#xff1b;多家主流媒体代表联袂参加&#xff1b;喜茶、中影时光国际影城、汉堡王、鲍师傅…...

如何创建响应式移动端网页设计?最佳实践详解

移动端网页设计是一个耗时而复杂的过程开发&#xff0c;包括UI设计、UX设计、检测、发布、改进、维护和持续的错误修复。通过学习这篇文章&#xff0c;你将掌握什么是移动端网页&#xff0c;如何制作移动端网页&#xff0c;以及设计网页的技巧。 什么是移动端网页&#xff1f;…...

Python 如何进行Web抓取(BeautifulSoup, Scrapy)

Web抓取&#xff08;Web Scraping&#xff09;是一种从网站提取数据的技术。Python有许多用于Web抓取的库&#xff0c;其中最常用的是BeautifulSoup和Scrapy。 BeautifulSoup BeautifulSoup是一个用于解析HTML和XML文档的Python库&#xff0c;适合处理简单的Web抓取任务。它将…...

白骑士的PyCharm教学进阶篇 2.5 数据库连接与管理

系列目录 上一篇&#xff1a;白骑士的PyCharm教学进阶篇 2.4 Django开发支持 在Web开发中&#xff0c;数据库是必不可少的部分。PyCharm不仅是一款功能强大的IDE&#xff0c;还提供了丰富的数据库连接和管理工具&#xff0c;使开发者可以更方便地浏览和操作数据库。本篇将详细…...

(五)activiti-modeler 编辑器初步优化

最终效果&#xff1a; 1..首先去掉顶部的logo&#xff0c;没什么用&#xff0c;还占用空间。 修改modeler.html文件&#xff0c;添加样式&#xff1a; <style type"text/css"> #main-header{display: none; } #main{padding: 0px; } </style> 2.左边组…...

(学习总结12)C++类和对象3

C类和对象3 一、初始化列表二、类型转换三、static成员四、友元五、内部类六、匿名对象 以下代码环境在 VS2022。 一、初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有⼀种方式&#xff0c;就是初始化列表&a…...

docxtpl,一个强大的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - docxtpl。 项目地址&#xff1a;https://docxtpl.readthedocs.io/en/latest/ 在日常工作中&#xff0c;自动生成和处理 Word 文档是一个常见需求。doc…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

node.js的初步学习

那什么是node.js呢&#xff1f; 和JavaScript又是什么关系呢&#xff1f; node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说&#xff0c; 需要在node.js的环境上进行当JavaScript作为前端开发语言来说&#xff0c;需要在浏览器的环境上进行 Node.js 可…...

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S&#xff08;Inter-Integrated Circuit Sound&#xff09;是一种用于传输数字音频数据的通信协议&#xff0c;广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设&#xff0c;通过配置…...

Spring是如何实现无代理对象的循环依赖

无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见&#xff1a;mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中&#xff0c;两个或多个对象相互依赖&#xff0c;导致创建过程陷入死循环。以下通过一个简…...

CKA考试知识点分享(2)---ingress

CKA 版本&#xff1a;1.32 第二题是涉及ingress相关。本文不是题目&#xff0c;只是为了学习相关知识点做的实验。 1. 环境准备 需要准备一套K8S集群。 1.1 安装ingress-nginx 下载deploy文件&#xff1a; wget -O controller-v1.12.2.yaml https://raw.githubusercontent…...

Python基于蒙特卡罗方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融投资中&#xff0c;风险管理是确保资产安全和实现稳健收益的关键环节。随着市场波动性的增加&#xff0c;传统…...