makefile文件

简介:

自动化编译:只需要一个make命令,整个工程自动编译

提高编译效率:再次编译时,只编译修改的文件(查看时间戳,根据修改文件的时间判断文件是否被修改)

基本语法:

{

目标:依赖

命令

}

{

target... : prerequisites ...
command

}
target 也就是一个目标文件,可以是 Object File ,也可以是执行文件。还可以是一个标签( Label ),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites 就是,要生成那个 target 所需要的文件或是目标。
command 也就是 make 需要执行的命令。(任意的 Shell 命令)

例:

一步编译:.c——>exe

test:add.c sub.c test.cgcc add.c sub.c test.c -o test

两步编译:.c——>.o ——>exe

add.o:add.cgcc -c add.c -o add.o
sub.o:sub.cgcc -c sub.c -o sub.o
test.o:test.cgcc -c test.c -o test.o
test:add.o sub.o test.ogcc add.o sub.o test.c -o test
注意:

1.makefile只识别第一个目标,也就是上图中的add.o

2.因此应修改为下图中的形式,将最终目标作为第一目标

3.会去找当前路径下第一目标的依赖文件,如果依赖文件不存在,就会去找下一个目标,直到第一目标的依赖全部得到

test:add.o sub.o test.ogcc add.o sub.o test.c -o test
add.o:add.cgcc -c add.c -o add.o
sub.o:sub.cgcc -c sub.c -o sub.o
test.o:test.cgcc -c test.c -o test.o

4.make默认执行第一目标,直接执行其他目标格式为"make+目标名"

例:make clean

test:add.o sub.o test.ogcc add.o sub.o test.c -o test
add.o:add.cgcc -c add.c -o add.o
sub.o:sub.cgcc -c sub.c -o sub.o
test.o:test.cgcc -c test.c -o test.o
clean:rm *.o

5.如果当前目录下有最新的clean文件,执行make clean时将会报错,因此修改如下图,通过建立伪目标方式(不是真正想要生成clean文件)

test:add.o sub.o test.ogcc add.o sub.o test.c -o test
add.o:add.cgcc -c add.c -o add.o
sub.o:sub.cgcc -c sub.c -o sub.o
test.o:test.cgcc -c test.c sub.o test.o#伪目标
.PHONY:clean
clean:rm *.o

makefile的变量:

自定义变量:

x = a         变量在声明时需要给予初值(给变量x赋值a)
$(x) 或 ${x}         取值

例:

SRC=add.o sub.o test.otest:add.o sub.o test.ogcc $(SRC) -o test
add.o:add.cgcc -c add.c -o add.o
sub.o:sub.cgcc -c sub.c -o sub.o
test.o:test.cgcc -c test.c sub.o test.o#伪目标
.PHONY:clean
clean:rm *.o

注意:

1.如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。

2.

SRC=add.o sub.o test.otest:add.o sub.o test.ogcc $(SRC) -o test

变量的赋值:

自动化变量:

此些符号表示变量名,代表了符合的文件(以及输出方式)

隐含变量:

此下变量名是专门为一个功能提供的。

makefile的条件判断:

ifeq:

使用方式:ifeq开头,endif结尾

ifeq($(ARCH),X86)
CC=gccelseCC=arm-none-linux-gcc
endif

含义:如果变量ARCH中的值为X86,执行CC=gcc操作,否则就执行CC=arm-none-linux-gcc操作

ifneq:

使用方式同ifeq,意思相反

ifdef:

使用方式ifdef开头,endif结尾

ifdef ARCH
CC=gccelseCC=arm-none-linux-gcc
endif

含义:如果变量ARCH被定义,执行CC=gcc,否则执行CC=arm-none-linux-gcc

ifndef:

使用方式同ifdef

makefile函数:

基本语法:

$(<function> <arguments>)
或是
${<function> <arguments>}

$(<函数名><参数1,参数2,参数3,.....>)

wildcard函数:

$(wildcard PATTERN)
功能:列出当前目录下所有符合模式“ PATTERN” 格式的文件名。
返回:空格分割的、存在当前目录下的所有符合模“ PATTERN” 的文件名。
说明:“ PATTERN” 使用 shell 可识别的通配符,包括“ ?” (单字
符)、“ *” (多字符)等。
示例: $(wildcard *.c) 返回值为当前目录下所有 .c 源文件列表。

示例:

SRC=$(wildcard *.c)all:echo $(SRC)

输出为当前路径下所有的.c文件

patsubst函数:

$(patsubst <pattern>,<replacement>,<text>)
名称:模式字符串替换函数。
功能:查找 <text> 中的单词(单词以“空格”、“ Tab” 或“回车”“换行”分隔)是否符合模式 <pattern> ,如果匹配的话,则以<replacement> 替换。

这里, <pattern> 可以包括通配符 % ,表示任意长度的字串。

如果 <replacement> 中也包含 % ,那么, <replacement>中的这个 % 将是 <pattern> 中的那个 % 所代表的字串。(可以用 \ 来转义,以 \% 来表示真实含义的 % 字符)
返回:函数返回被替换过后的字符串。

例:

SRC=$(wildcard *.c)
OBJ=$(patsubst %.c,%.o,$(SRC))all:echo $(OBJ)

含义:将路径下所有.c文件赋值到SRC中,再将SRC中的文件与是否符合.c后缀,如果符合,就使用.o后缀替换SRC中的文件,返回值赋值给OBJ

自定义函数:

需要使用系统提供的call函数

例:

含义:定义echo ”*****“的名字为MYFUN,使用call函数调用MYFUN函数

define MYFUNecho "*****"
endefall:$(call MYFUN)

含义:定义MYFUN函数,输出的参数是以call函数的参数

define MYFUNecho "*****"echo $(0)    //表示输出第一个参数echo $(1)    //表示输出第二个参数echo $(2)    //表示输出第三个参数
endefall:$(call MYFUN,10,20)    //第一个参数:MYFUN;第二个参数:10;第三个参数:20;

 注意:

1.依赖可以是0个也可以是多个,用空格隔开

2.命令前需要使用Tab键空开

3.使用"#"作为注释符

4.在终端make命令后也可以赋值

含义:执行make命令,并且给ARCH变量赋值X86

make ARCH=X86

5.如果函数名称正确,函数名将会变成黄色,函数与参数之间使用空格隔开,参数间使用逗号隔开

6.

相关命令:

echo:

使用方式:echo+数据

功能:将数据输出到终端

@:

在makefile文件的命令前加@,命令的名称将不会显示在终端上(仍会执行)

例:

SRC=add.o sub.o test.otest:add.o sub.o test.ogcc $(SRC) -o test
add.o:add.cgcc -c add.c -o add.oecho $*echo $@@echo $*@echo $@sub.o:sub.cgcc -c sub.c -o sub.o
test.o:test.cgcc -c test.c sub.o test.o#伪目标
.PHONY:clean
clean:rm *.o

输出如下图:

echo add.c
echo add
add.c
add

终端上只会显示自动化变量" * "表示的值,不会显示"echo"命令名称

gcc:

-E:预处理,生成.i文件

-S:编译,生成.s文件

-c:汇编,生成.o文件

-g:生成GDB调试信息

-I(大爱):+文件路径,链接其他路径下文件

-Wall:调试错误

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArKTS基础组件

一.AlphabetIndexer 可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件。 子组件 color:设置文字颜色。 参数名类型必填说明valueResourceColor是 文字颜色。 默认值&#xff1a;0x99182431。 selectedColor:设置选中项文字颜色。 参数名类型必填说明valueRes…

微积分复习笔记 Calculus Volume 2 - 4.3 Separable Equations

4.3 Separable Equations - Calculus Volume 2 | OpenStax

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…

WPF DataTemplate 数据模板

DataTemplate 顾名思义&#xff0c;数据模板&#xff0c;在 wpf 中使用非常频繁。 它一般用在带有 DataTemplate 依赖属性的控件中&#xff0c;如 ContentControl、集合控件 ListBox、ItemsControl 、TabControls 等。 1. 非集合控件中使用 <UserControl.Resources>&l…

LM芯片学习

1、LM7805稳压器 https://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn1852815231102873600&utm_sourcewechat_sessionhttps://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn18528…

OCR多模态大模型:视觉模型与LLM的结合之路

原文&#xff1a;https://zhuanlan.zhihu.com/p/7783443583 在使用多模态大模型(Visual Language Model, VLM)做视觉信息抽取时&#xff0c;常常出现错字的问题。为了解决这一问题&#xff0c;本文提出了一种名为Guidance OCR的方法。该方法在不额外训练模型的情况下&#xff…

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

飞牛 fnos 上用docker部署一款网页端办公系统

描述 一款高效的内网办公操作系统&#xff0c;内含word/excel/ppt/pdf/内网聊天/白板/思维导图等多个办公系统工具&#xff0c;支持原生文件存储。平台界面精仿windows风格&#xff0c;操作简便&#xff0c;同时保持低资源消耗和高性能运行。无需注册即可自动连接内网用户&…

【网络安全】网站常见安全漏洞—服务端漏洞介绍

文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞&#xff1f;如何防范&#xff1f; 2. SQL 注入什么是SQL注入&#xff1f;如何防范&#xff1f; 3. 命令执行漏洞什么是命令执行漏洞&#xff1f;如何防范&#xff1f; 4. 越权漏洞什么是越…

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架&#xff0c;适用于&#xff1a;单元测试、Web自动…

C++动态规划解决最长公共子序列

动规非常经典的一道题目&#xff0c;由于需要用到二维数组——姑且算为中等难度的题目&#xff0c;其实和01背包有着极高的相似度&#xff0c;无论是实现还是理论。 今天这篇博客不讲过多的DP理论&#xff0c;重在讲解题目本身。其实有一定经验的同志都清楚&#xff0c;DP的难点…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

《Modern CMake for C++》学习笔记

学习 Modern CMake for C - Second Edition 时的学习笔记&#xff0c;供大家参考。 相关资源&#xff1a; 原书链接&#xff1a; Modern CMake for C: Effortlessly build cutting-edge C code and deliver high-quality solutions , Second Edition 中文翻译链接&#xff1a…

实战 | 某院校小程序记录

更多大厂面试经验的视频分享看主页和专栏 目录&#xff1a; 前言&#xff1a; 渗透思路 1.绕过前端 2.信息泄露 3.爆破用户账号密码 4.信息泄露2 结束 前言&#xff1a; 遇到一个学校小程序的站点&#xff0c;只在前端登录口做了校验&#xff0c;后端没有任何校验&#x…

Visual studio的AI插件-通义灵码

通义灵码 TONGYI Lingma 兼容 Visual Studio、Visual Studio Code、JetBrains IDEs 等主流 IDE&#xff1b;支持 Java、Python、Go、C/C、C#、JavaScript、TypeScript、PHP、Ruby、Rust、Scala 等主流编程语言。 安装 打开扩展管理器&#xff0c;搜送“TONGYI Lingma”&…

【泛微系统】HR同步功能实例讲解

HR同步功能实例讲解\ 前言 HR同步是指ecology与专业的人事管理软件进行数据同步的功能,ecology中的组织结构和人员信息将完全取自HR软件。 官方HR同步功能解释 实例背景 客户本身有外购EHR系统用于员工的入转调离的基础信息管理,现又外购泛微的OA系统用于企业信息协同办…

【测试】Pytest

建议关注、收藏&#xff01; 目录 功能pytest 自动化测试工具。 功能 单元测试&#xff1a;用于验证代码的最小功能单元&#xff08;如函数、方法&#xff09;的正确性。 简单的语法&#xff1a;不需要继承特定类或使用复杂的结构。断言语句简化。 自动发现测试&#xff1a;P…

实验12 socket网络编程

设计程序 1&#xff0e;阅读TCP、UDP数据通信的例子8-2、8-7&#xff0c;理解并运行查看其功能。 2. 编写程序&#xff0c;使用socket网络接口函数&#xff0c;实现同一网段的两台主机的聊天。注&#xff1a;使用多线程&#xff0c;实现实时聊天功能。&#xff08;使用UDP或TCP…

【LeetCode】2406、将区间分为最少组数

【LeetCode】2406、将区间分为最少组数 文章目录 一、数据结构-堆、贪心1.1 数据结构-堆、贪心1.2 多语言解法 二、扫描线2.1 扫描线 一、数据结构-堆、贪心 1.1 数据结构-堆、贪心 题目已知一些区间, 需要尽量合并, 使 组 最少. 可以用图解画一下 因为尽量合并, 为了紧凑, …

【Python】利用函数模拟创建【栈】的数据结构操作

知识解读&#xff1a;来自&#xff1a;https://fishc.com.cn[#FwSB,M 9xKOA!^6fP)_EC(nsd什么是栈呢&#xff1f;Powered by https://fishc.com.cn3>A?5JXL#_}YBGD"FWdubKeyhQP栈是一种具有 FILO 特性的数据结构&#xff0c;即先放入的数据反而后取出。e&"%b…