webserver中:MakeFile

一个 Makefile 文件中可以有一个或者多个规则
目标 ...: 依赖 ...
命令(Shell 命令)
...
目标:最终要生成的文件(伪目标除外)
依赖:生成目标所需要的文件或是目标
命令:通过执行命令对依赖操作生成目标(命令前必须 Tab 缩进)
app: sub.c add.c mult.c div.c main.c
gcc sub.c add.c mult.c div.c main.c -o app
命令在执行之前,需要先检查规则中的依赖是否存在
如果存在,执行命令
如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,
如果找到了,则执行该规则中的命令
app:sub.o add.o mult.o div.o main.o
gcc sub.o add.o mult.o div.o main.o -o app
sub.o:sub.c
gcc -c sub.c -o sub.o
add.o:add.c
gcc -c add.c -o add.o
mult.o:mult.c
gcc -c mult.c -o mult.o
div.o:div.c
gcc -c div.c -o div.o
main.o:main.c
gcc -c main.c -o main.o
检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
如果依赖的时间比 目标的时间晚,需要重新生成目标
如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被
执行
如果不更改文件, make 输出
make: “app”已是最新。
更改了 main.c 文件,则输出
gcc -c main.c -o main.o
gcc sub.o add.o mult.o div.o main.o -o app
自定义变量
变量名 = 变量值
var=hello
预定义变量
AR : 归档维护程序的名称,默认值为 ar
CC : C 编译器的名称,默认值为 cc
CXX : C++ 编译器的名称,默认值为 g++
$@ : 目标的完整名称
$< : 第一个依赖文件的名称
$^ : 所有的依赖文件
获取变量的值
$( 变量名 )
app:main.c a.c b.c
gcc -c main.c a.c b.c
# 自动变量只能在规则的命令中使用
app:main.c a.c b.c
$(CC) -c $^ -o $@
$(var)
add.o:add.c
gcc -c add.c
div.o:div.c
%.o:%.c
gcc -c div.c
- %: 通配符,匹配一个字符串
sub.o:sub.c
- 两个 % 匹配的是同一个字符串
gcc -c sub.c
%.o:%.c
mult.o:mult.c
gcc -c $< -o $@
gcc -c mult.c
main.o:main.c
gcc -c main.c
$(wildcard PATTERN...)
功能:获取指定目录下指定类型的文件列表
参数: PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多
个目录,一般使用空格间隔
返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
示例:
$(wildcard *.c ./sub/*.c)
返回值格式 : a.c b.c c.c d.c e.c f.c $(patsubst <pattern>,<replacement>,<text>)
功能:查找 <text> 中的单词 ( 单词以“空格”、“ Tab ”或“回车”“换行”分隔 ) 是否符合
模式 <pattern> ,如果匹配的话,则以 <replacement> 替换。
<pattern> 可以包括通配符 `%` ,表示任意长度的字串。如果 <replacement>
中也包含 `%` ,那么, <replacement> 中的这个 `%` 将是 <pattern> 中的那个 %
所代表的字串。 ( 可以用 `\` 来转义,以 `\%` 来表示真实含义的 `%` 字符 )
返回:函数返回被替换过后的字符串
示例:
$(patsubst %.c, %.o, x.c bar.c)
返回值格式 : x.o bar.o
src=sub.o add.o mult.o div.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
找依赖,找 sub.o 如果没有找到,则找到第二条 %.o:%.c 通用模式匹配,编译出 sub.o
src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(objs)
$(CC) $(objs) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
默认执行第一个规则 ,如果想 执行其他需要指定 make clean
src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app
$(target):$(objs)
$(CC) $(objs) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
clean:rm $(objs) -f
定义为伪目标,就不会生成特定的文件
.PHONY:clean
clean:
rm $(objs) -f

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

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

相关文章

如何在 Ubuntu 上安装 RStudio IDE(R语言集成开发环境) ?

RStudio 是一个功能强大的 R 语言集成开发环境(IDE)&#xff0c;R 是一种主要用于统计计算和数据分析的编程语言。任何从事数据科学项目或任何其他涉及 R 的类似任务的人&#xff0c;RStudio 都可以使您的工作更轻松。 本指南将引导您完成在 Ubuntu 系统上安装 RStudio 的过程…

C++玩转物联网:认识树莓派Pico

在嵌入式编程的领域中&#xff0c;树莓派Pico、Arduino和ESP32都是广受欢迎的微控制器开发板&#xff0c;但它们在性能、功能和编程语言支持上各有特点。树莓派Pico是树莓派基金会推出的一款高性价比开发板&#xff0c;搭载了RP2040微控制器&#xff0c;支持标准的C库&#xff…

网络基础 - 网段划分篇

我们知道&#xff0c;IP 地址(IPv4 地址)由 “网络标识(网络地址)” 和 “主机标识(主机地址)” 两部分组成&#xff0c;例如 192.168.128.10/24&#xff0c;其中的 “/24” 表示从第 1 位开始到多少位属于网络标识&#xff0c;那么&#xff0c;剩余位就属于主机标识了&#xf…

当微软windows的记事本被AI加持

1985年&#xff0c;微软发布了Windows 1.0&#xff0c;推出了一款革命性的产品&#xff1a;记事本&#xff08;Notepad&#xff09;。这款软件旨在鼓励使用一种未来主义的新设备——鼠标&#xff0c;并让人们可以不依赖VI等键盘工具就能书写文本和编写代码。记事本因其简洁和高…

FastGPT + Dify,本地知识库快速部署!

本文主要内容 本地部署 Dify、FastGPT、OllamaDify、FastGPT 对接一些目前免费的 LLM 大语言 AI 模型Dify、FastGPT 对接 Ollama 本地模型 大家好&#xff0c;我是一名喜欢在家折腾本地部署的开发者&#xff0c;这次我来分享如何在本地运行 Ollama&#xff0c;并将它与 FastG…

黄仁勋对话孙正义:日本的AI新饼、Arm的AI野心与英伟达的东亚新机会

2020 年的软银世界大会上&#xff0c;孙正义与黄仁勋围绕「What’s Next for AI」展开了一次围炉对谈。黄仁勋穿着标志性的皮夹克坐在火堆旁&#xff0c;畅谈了将 Arm 纳入麾下的重要价值&#xff0c;孙正义也毫不吝啬赞美之词&#xff0c;称老黄在未来 10 年会达到史蒂夫 乔布…

什么是邻道泄露抑制比(ACLR)

今天和大家一起学习交流下邻道泄露抑制比(ACLR)指标,看看是否 让你产生一些新的灵感。 什么是ACLR? 邻道泄露抑制比是用于衡量下行的发射性能,是主信道的发射功率与测得的相邻信道的功率之比。ACLR值越低,表示相临信道的功率的干扰越小,说明系统的性能越好。一般用dB…

VMware和CentOS 7.6 Linux操作系统的安装使用

1. 安装VMware 安装VMware之前&#xff0c;有些电脑是需要去BIOS里修改设置开启cpu虚拟化设备支持才能安装。如果运气不好在安装过程中安装不了的话就自行百度吧。 打开 VMware 的官网: https://www.vmware.com/ 点击 product&#xff0c;往下滑找到 see desktop hypeerviso…

沈阳乐晟睿浩科技有限公司抖音小店保障

在当今这个数字化时代&#xff0c;电子商务行业以其便捷性、高效性和广泛的覆盖面&#xff0c;成为了推动经济发展的新引擎。沈阳乐晟睿浩科技有限公司&#xff0c;作为这股变革洪流中的佼佼者&#xff0c;凭借其深厚的技术实力、敏锐的市场洞察力和前瞻性的战略布局&#xff0…

学习日志009--面向对象的编程

一、面向对象 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计应用程序和计算机程序。它利用了抽象、封装、继承和多态这些概念。 一、面向对象编程的核心概念 封装&#xff08;Encaps…

Sorvall Legend Micro 17 微量离心机产品特性

在科研实验中&#xff0c;微量离心机扮演着至关重要的角色。其中&#xff0c;Thermo Scientific Sorvall Legend MicroCL 17R 微量离心机凭借其出色的性能和紧凑的设计&#xff0c;成为众多科研人员的首选。 这款微量离心机体积小巧&#xff0c;非常适合空间有限的实验室。它支…

Camp4-L2:InternVL 多模态模型部署微调实践

书生浦语大模型实战营第四期&#xff1a;InternVL 多模态模型部署微调实践 教程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/InternVL视频链接&#xff1a;https://www.bilibili.com/video/BV1nESCYWEnN/任务链接&#xff1a;https://github.co…

Unity内置渲染管线升级URP,使用ShaderGraph

问题描述 在内置渲染管线的工程中&#xff0c;导入之前通过ShaderGraph制作的Shader。 文件不可打开&#xff0c;我们需要升级成URP 过程记录 当前Unity版本 2022.3.49 安装Package 创建配置文件 Assets -> Rendering -> URP Asset 创建成功 修改配置 Edit->P…

MYSQL 修改表的结构

在项目的实际开发中&#xff0c;随着版本的迭代和需求的变更&#xff0c;经常会对表结构进行调整&#xff0c;比如向现有表中添加列&#xff0c;删除列&#xff0c;或者修改某列的列名、数据类型或长度&#xff0c;这时就需要对表进行修改操作。 修改表结构语法 ALTER TABLE t…

夹耳开放式耳机好用吗?夹耳开放式耳机推荐

夹耳式耳机作为开放式耳机的一种&#xff0c;在最近几年里深受大家欢迎。它能够受到大家欢迎的原因主要是其不入耳的特性&#xff0c;既有助于保护听力健康&#xff0c;又能让人尽情享受极致的音乐体验。不过&#xff0c;很多小伙伴不知道夹耳式耳机到底好不好用&#xff1f;夹…

React--》掌握openapi-typescript-codegen快速生成API客户端代码

今天深入探索一个神奇的工具——openapi-typescript-codegen。它不仅能够帮助你快速生成TS代码&#xff0c;还能让你的API请求更加高效、类型安全&#xff0c;让开发者摆脱手动编写冗长请求代码的困扰&#xff0c;专注于实现业务逻辑。接下来让我们一起来了解它的强大功能和使用…

【C++】类中的“默认成员函数“--构造函数、析构函数、拷贝构造、赋值运算符重载

目录 "默认"成员函数 概念引入&#xff1a; 一、构造函数 问题引入&#xff1a; 1&#xff09;构造函数的概念 2&#xff09;构造函数实例 3&#xff09;构造函数的特性 4)关于默认生成的构造函数 (默认构造函数) 默认构造函数未完成初始化工作实例: 二…

中仕公考怎么样?事业编面试不去有影响吗?

事业编考试笔试已经通过&#xff0c;但是面试不去参加会有影响吗&#xff1f; 1. 自动放弃面试资格&#xff1a;未能按时出席事业单位的面试将被视为主动放弃该岗位的竞争机会。 2. 个人信誉问题&#xff1a;面试作为招聘流程的关键步骤&#xff0c;无故缺席可能被解释为诚信…

websocket初始化

websocket初始化 前言 上一集我们HTTP的ping操作就可以跑通了&#xff0c;那么我们还有一个协议---websocket&#xff0c;我们在这一集就要去完成我们websocket的初始化。 分析 我们在初始化websocket的之前&#xff0c;我们考虑一下&#xff0c;我们什么时候就要初始化我们…

Unity中HDRP设置抗锯齿

一、以前抗锯齿的设置方式 【Edit】——>【Project Settings】——>【Quality】——>【Anti-aliasing】 二、HDRP项目中抗锯齿的设置方式 在Hierarchy中——>找到Camera对象——>在Inspector面板上——>【Camera组件】——>【Rendering】——>【Pos…