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

Makefile学习2

自动变量和通配符
* 通配符

* 和 % 在Make 中都被称为通配符,但他们的含义完全不同。 * 会在你的文件系统中搜索匹配的文件名。可以在目标,先决条件或 wildcard 函数中使用。

print:$(wildcard *.c)ls -la $?

wildcard 作用:在 Makefile 规则中,通配符会被自动展开。但在变量的定义和引用时,通配符将是小。这种情况如果需要通配符有效,就需要使用函数 wildcard,它的用法是 $(wildcard PATTERN)。

$? 表示比目标还要新的依赖文件列表

要注意的是:* 不可以在变量中使用,就如上面所说的的 wildcard 规则所说
第二个是:当* 不匹任何文件时,它将维持原样(除非在 wildcard 函数中运行)

thing_wrong := *.o #错误一:在变量中不展开
thing_right := $(wildcard *.o)all :one two three four#失败,因为$(thing_wrong)是字符串 ".o"
one:$(thing_wrong)
#如果没有与此模式匹配的文件,则保持为 *.o
two:*.o
#如你所料!在这种情况下,它什么也不做
three:$(thing_right)
#与规则three相同
four:$(wildcard *.o)
%通配符

用来匹配任意一个字符

  • 在“匹配”模式下使用时,匹配字符串中的一个或多个字符。这种匹配被称为词干。
  • 在“替换”模式下使用时,它会获取匹配的词干,并替换字符串中的词干。
  • % 最常用于规则定义和某些特定函数中。
自动变量
hey:one two
//输出“hey”,因为这是目标名称
echo $@
//输出比目标更新的所有先决条件
echo $?
//输出所有先决条件
echo $^touch hey
one :touch one
two :touch two
clean:rm -f hey one two
其它规则
隐式规则

Make 偏爱 c 编译。而每次它出现这种偏爱的时候,事情就变得混乱。也许 Make 中 最令人困惑的部分是Make 的魔术/自动规则 (magic/automatic rules)。Make 会调用这些“隐含的”规则。

  • 编译 c 程序:从 n.c 自动生成 n.o,命令形式为 $(CC) -c $(CPPFLAGS) $(CFLAGS)
  • 编译 C++ 程序:n.o 由 n.cc 或 n.cpp 自动生成,命令形式为 $(CXX) -c $(CPPFLAGS) $(CXXFLAGS)
  • 链接单个目标文件:自动从 n.o 构造 n,通过运行命令 $(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

隐式规则使用的重要变量包括:

  • CC :编译 C 程序的程序;默认为 cc
  • CXX:编译 C++ 程序的程序; 默认为 g++
  • CFLAGS : 要提供给 C 编译器的额外标志
  • CXXFLAGS : 给 C++ 编译器的额外标志
  • CPPFFLAGS :要提供给 C 预处理器的额外标志
  • LDFLAGS: 当编译器英国调用链接器时,会给他们额外的标志

构建一个 C 程序,而无需明确地告诉制造如何进行编译

CC = gcc #隐式规则标志
CFLAGS = -g #隐式规则的标志。打开调试信息#隐式规则 #1:blah是通过 C 链接器隐式规则构建的
#隐式规则 #2:blah.o 是通过 C 编译隐式规则构建的,因为 blah.c 存在blah:blah.oblah.c:echo "int main() {return 0;}" > blah.c
clean:rm -f  blah
静态模式规则

静态模式规则是在 Makefile 中减少编写量的另一种方式,但我会说更有用,并且“魔术”技巧更少。它们的语法如下:

targets...:target-pattern:prereq-patterns...commands

本质是给定的 target 与 target-pattern 匹配(通过 % 通配符)。任何匹配的东西都被称为词干。然后将词干替换为 “prereq-pattern”,以生成目标的prereq。

一个典型的用例是将 .c 文件编译成 .o 文件。这里是手动方式:

object = foo.o bar.o all.o
all:$(object)#这些文件通过上面隐式规则进行编译
foo.o:foo.c
bar.o:bar.c
all.o:all.call.c :echo "int main() {return 0;}"> all.c
%.c:touch $@
clean:rm -f *.c *.o all

这是使用静态模式规则的更高效的方式:

object= foo.o bar.o all.o
all:$(object)#这些文件通过隐式规则进行编译
#语法-targets...:target-pattern: prereq-patterns...
#在第一个目标 foo.o 的情况下,目标模式与 foo.o 匹配,并将 “词干” 设置为 “foo”
#然后用该词干替换 prereq 模式中的 “%”
$(object):%.o:%.c
all.c:echo "int main(){return 0;}">all.c
%.c:touch $@
clean:rm -f *.c *.o all
静态模式规则和过滤器

filter 过滤器函数可以在静态模式规则中使用,以匹配正确的文件

obj_files=  bar.o lose.o
src_file= bar.c lose.c
all:$(obj_files)
$(filter %.o, $(obj_files)):%.o:%.c
%.c :touch $@
clean:rm -f $(src_files)
模式规则

模式规则经常被使用,但非常令人困惑,你可以从两个方面看待他们:

  • 定义自己的隐含规则的方法
  • 静态模式规则的更简单形式
#定义将每个 .c 文件编译为 .o 文件的模式规则
%.o %.c$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

模式规则在目标中包含 % 。此 % 匹配任何非空字符串,其他字符匹配自己。模式规则先决条件中的 % 代表与目标中 % 匹配的同一词干

#定义一个在先决条件中没有模式的模式规则
#这只会在需要时创建空的 .c 文件
%.c:touch $@
双冒号规则

很少使用双冒号规则,但用它允许为同一目标定义多个规则。如果这些规则是单冒号,则会打印一条警告1,并且只运行这里的第二条命令

all:blahblah::echo "hello"blah::echo "hello agagin"
命令和执行
命令回显/静默

在命令之前添加 @ 以阻止其打印
还可以运行带有 -s 的 make 命令,等同于在每行前面添加一个 @

all:@echo "this make line will not be printed"echo "But this will"
命令执行

每个命令都在一个新的 shell 中运行(或者至少效果是这样的)

all:cd..#上面的 cd 不会影响该行,因为每个命令都有效的在新的 shell 中运行echo 'pwd'# 此 cd 命令会影响下一个命令,因为它们在同一行上cd..;echo 'pwd'#同上cd..;\echo 'pwd'
默认 Shell

默认 Shell 是 ‘/bin/sh’。你可以通过更改变量 SHELL 来更改此设置:

SHELL=/bin/bash
cool:echo "Hello from bash"
-k、-i、-错误处理

-k 表示终止出错命令,继续执行下面的命令
在命令前添加 - 以抑制错误:表示命令不管怎么样都必须执行命令
-i 表示忽略全部错误,强制执行每一条命令

中断或者杀死Make

备注:如果你对 make 按下 ctrl+c, 它将删除它刚刚创建的教新的目标

Make的递归使用

要递归调用 makefile,请使用特殊的 $(MAKE) 而不是 make,因为这样它才能为你传递 make 标志,并且本身不会受到它们的影响。

new_contents= "hello:\n\ttouch inside_file"
all:make -p subdirprintf $(new_contents)|sed -s 's/^//'>subdir/makefilecd subdir&&$(MAKE)
clean:rm -rf subdir
make的参数

可以有多个目标来make,例如 make clean run test,运行 clean,然后 run,然后 test

相关文章:

Makefile学习2

自动变量和通配符 * 通配符 * 和 % 在Make 中都被称为通配符&#xff0c;但他们的含义完全不同。 * 会在你的文件系统中搜索匹配的文件名。可以在目标&#xff0c;先决条件或 wildcard 函数中使用。 print:$(wildcard *.c)ls -la $?wildcard 作用&#xff1a;在 Makefile 规…...

【字符串】leetcode28. 实现 strStr()(C/C++/Java/Python/Js)

leetcode28. 实现 strStr&#xff08;&#xff09; 1 题目2 KMP2.1 什么是KMP&#xff1f;2.2 KMP有什么用&#xff1f;2.3 什么是前缀表&#xff1f;2.4 最长公共前后缀2.5 为什么一定要用前缀表&#xff1f;2.6 如何计算前缀表2.7 前缀表与next数组2.8 使用next数组来匹配2.9…...

游戏开发是个“坑”,而且是个“天坑”

本文首发于CSDN公众号 作者 | 开发游戏的老王 责编 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 各位游戏开发者大家好&#xff0c;我是开发游戏的老王&#xff0c;一名游戏开发者同时也是一名高校游戏方向的主讲教师&#xff0c;从事游戏开发及相关教…...

剑指 Offer 64. 求 1 + 2 + … + n(java解题)

剑指 Offer 64. 求 1 2 … n&#xff08;java解题&#xff09;1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码1. 题目 求 12…n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 示例…...

2022 年度_职业项目总结_Java技术点归纳

Java技术点归纳目录概述需求&#xff1a;设计思路实现思路分析1.Structs 元工程改造2.个贷子系统开发3.架构的迭代开发&#xff0c;升级&#xff0c;部署&#xff0c;参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,fu…...

【项目实战】32G的电脑启动IDEA一个后端服务要2min,谁忍的了?

一、背景 本人电脑性能一般&#xff0c;但是拥有着一台高性能的VDI&#xff08;虚拟桌面基础架构&#xff09;&#xff0c;以下是具体的配置 二、问题描述 但是&#xff0c;即便是拥有这么高的性能&#xff0c;每次运行基于Dubbo微服务架构下的微服务都贼久&#xff0c;以下…...

接口自动化面试题汇总(持续更新)

在自动化测试过程中&#xff0c;你如何处理测试数据&#xff1f;你会使用哪些方法来生成测试数据&#xff1f; 在自动化测试过程中&#xff0c;测试数据对于测试的准确性和覆盖率至关重要&#xff0c;常见方法有&#xff1a; 1、使用真实的生产数据&#xff1a;使用真实的生产…...

SpringBoot实现静态资源映射,登录功能以及访问拦截验证——以黑马瑞吉外卖为例

目录 一、项目简介 二、设置静态资源访问路径 三、实现登录功能 四、拦截访问请求 本篇文章以黑马瑞吉外卖为例 一、项目简介 瑞吉外卖项目分为后台和前台系统&#xff0c;后台提供给管理人员使用&#xff0c;前台则是用户订餐使用 资源我们放在resources下 二、设置静态…...

PythonWeb Django PostgreSQL创建Web项目(三)

了解Django框架下如何配置数据库链接与创建模型和应用 使用Django创建web项目&#xff0c;首先需要了解生成的项目文件结构&#xff0c;以及对应文件功能用途方可开始web项目页面创建&#xff0c;下方先介绍文件功能&#xff0c;之后再配置数据库连接以及管理创建模型与应用&a…...

【Visual Studio】git提交代码时使用GPG

前言 下载安装GPG的过程省略,直接开始进行配置 0.visual studio 版本说明 其余版本未测试,但是应该也是可以的 1 获取GPG的密钥ID 1.1 window下可以打开Kleopatra查看生成好的密钥的密钥ID 1.2 也可以从命令行中获取 gpg --list-keys 红框位置,后16位就是密钥ID 2 配置.git…...

【反序列化漏洞-02】PHP反序列化漏洞实验详解

为什么要序列化百度百科上关于序列化的定义是&#xff0c;将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis&#xff0c;与数组类似)。以后&#xff0c;可以通过…...

Gateway网关的使用

Gateway服务网关Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。1…...

【LeetCode】背包问题总结

文章目录一、背包能否装满&#xff1f;416. 分割等和子集1049. 最后一块石头的重量 II二、装满背包有几种方法&#xff1f;494. 目标和518.零钱兑换II377. 组合总和 Ⅳ70. 爬楼梯三、背包装满的最大价值474.一和零四、装满背包最小物品数322. 零钱兑换279.完全平方数一、背包能…...

Java的开发工具有哪些?这十款工具大厂都在用!

工欲善其事必先利其器&#xff0c;各位同学大家好&#xff0c;我是小源~本期文章&#xff0c;给大家推荐十款Java的开发工具。一、 文本编辑器主要推荐三款&#xff1a;notepad、editplus、sublime text。这三款编辑工具&#xff0c;在我们的开发工作中几乎是相差无几&#xff…...

web学习-Node.js入门学习

web学习-Node.js入门学习1.回顾与思考2. 初识Node.js2.1 Node.js的简介2.2Node.js的环境安装2.3. fs文件系统模块2.3.1 fs.readFile()2.3.2 fs.writeFile()2.3.3 练习-整理考试成绩2.3.4 fs模块-路径动态拼接的问题2.4 path路径模块2.5 http模块2.5.1 服务器相关的概念2.5.2 创…...

100 eeeee

全部 答对 答错 敏捷综合训练3 1.看板中的精益生产概念是如何减少工作在瓶颈时期的影响&#xff1f; A它不会减少瓶颈&#xff0c;因为瓶颈是任何生产系统不可避免的副产品 B通过运用 5Y 分析根本原因 C通过成为一个及时的进度系统 D通过每周完善活动 答错了 收藏 学员得…...

物盾安全汤晓冬:工业互联网企业如何应对高发的供应链安全风险?

编者按&#xff1a;物盾安全是一家专注于物联网安全的产品厂商&#xff0c;其核心产品“物安盾”在能源、制造、交通等多个领域落地&#xff0c;为这些行业企业提供覆盖物联网云、管、边、端的安全整体解决方案。“物安盾”集成了腾讯安全制品扫描&#xff08;BSCA&#xff09;…...

微纳制造技术——基础知识

1.什么是直接带隙半导体和间接带隙半导体 导带底和价带顶处以同一K值&#xff0c;称为直接带隙半导体 导带底和价带顶不处在同一K值&#xff0c;称为间接带隙半导体 2.扩散和漂移的公式 3.三五族半导体的性质 1.high mobility 2.wide bandgap 3.direct bandgap 4.三五族…...

Makefile的使用

Makefile的使用 自动化编译脚本&#xff0c;这个东西就是&#xff0c;进行简单的设置&#xff0c;然后实现原码编成为相应程序&#xff0c;简单化自己进行相关操作的过程。不需要一个个自己进行全部进行输入。而且还有许多的简化书写方法。 ​ 这个Makefile的本质为一种脚本语言…...

RealBasicVSR模型转成ONNX以及用c++推理

文章目录安装RealBasicVSR的环境1. 新建一个conda环境2. 安装pytorch(官网上选择合适的版本)版本太低会有问题3. 安装 mim 和 mmcv-full4. 安装 mmedit下载RealBasicVSR源码下载模型文件写一个模型转换的脚步测试生成的模型安装RealBasicVSR的环境 1. 新建一个conda环境 cond…...

2025届学术党必备的五大降重复率方案横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下知网已然上线了AI检测功能&#xff0c;会针对论文里疑似人工智能生成的内容展开识别。为…...

GPT-Image-2提示词工程实战:从原理到应用,解锁高质量AI图像生成

1. 项目概述&#xff1a;一份高质量的GPT-Image-2提示词工程指南如果你正在使用OpenAI的GPT-Image-2模型&#xff0c;并且厌倦了反复尝试却只能得到平庸、不符合预期的图片&#xff0c;那么你找对地方了。我最近深度研究并实践了Anil-matcha维护的“Awesome GPT-Image-2 API Pr…...

电源设计和效率优化案例C01

本文重点讲清楚三个非常重要的问题: 手把手教会计算电源的效率计算,包括线性电源和开关电源等 1-电源的上下管的 Qg和Rdson为什么是一对矛盾量? 2-单相30A的电流输出电源要求,对上下管子应该如何取舍这两个参数,为什么? 电源设计是硬件设计的核心组成部分,尤其事目前…...

超完整Azure游戏开发模板:游戏服务器架构终极指南

超完整Azure游戏开发模板&#xff1a;游戏服务器架构终极指南 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates Azure Quickstart Templates是微软提供的开源项目&…...

别再复制粘贴了!手把手教你用MATLAB/Simulink把低通滤波器写成C代码(附差分方程推导避坑点)

从MATLAB到嵌入式C&#xff1a;工业级低通滤波器实现全解析 在电机控制、信号处理等嵌入式应用中&#xff0c;低通滤波器的实现质量直接影响系统性能。许多工程师习惯直接复制现成代码&#xff0c;却常遭遇数值不稳定、相位失真或计算效率低下等问题。本文将彻底拆解从S域传递函…...

RK3368安卓9.0固件烧录后开机卡Recovery?手把手教你调整分区表解决4GB闪存空间不足

RK3368安卓9.0固件烧录实战&#xff1a;4GB闪存分区优化全解析 当你满怀期待地将Android 9.0固件烧录到RK3368开发板&#xff0c;却发现设备直接进入了Recovery模式&#xff0c;屏幕上躺着那个令人沮丧的红色感叹号机器人——这可能是每个嵌入式开发者都经历过的"入门仪式…...

Audacity音频编辑教程:免费开源音频处理软件的完整使用指南

Audacity音频编辑教程&#xff1a;免费开源音频处理软件的完整使用指南 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity Audacity是一款功能强大的免费开源音频编辑软件&#xff0c;支持录音、剪辑、混音和音频效果…...

从AlphaGo到你的小游戏:如何用MCTS(蒙特卡洛树搜索)为你的五子棋项目加个‘智能大脑’

从AlphaGo到你的小游戏&#xff1a;如何用MCTS为五子棋项目构建智能决策引擎 当你在手机上下棋输给AI时&#xff0c;是否好奇过这些"电子大脑"如何思考&#xff1f;2016年AlphaGo击败李世石的关键技术之一——蒙特卡洛树搜索&#xff08;MCTS&#xff09;&#xff0c…...

自建链接管理服务OtterLink:从部署到实战的完整指南

1. 项目概述&#xff1a;一个链接管理的“瑞士军刀” 最近在折腾个人知识库和内容分发&#xff0c;发现一个痛点&#xff1a;手头攒了太多链接。技术文章、工具网站、项目仓库、临时笔记链接……散落在浏览器书签、聊天记录、备忘录里&#xff0c;时间一长要么找不到&#xff…...

在OpenClaw项目中配置Taotoken作为Agent的模型供应商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在OpenClaw项目中配置Taotoken作为Agent的模型供应商 基础教程类&#xff0c;指导在虚拟机环境使用OpenClaw框架开发AI Agent的用户…...