makefile文件

简介:

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

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

基本语法:

{

目标:依赖

命令

}

{

target... : prerequisites ...
command

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

例:

一步编译:.c——>exe

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

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

add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -c test.c -o test.o
test:add.o sub.o test.o
    gcc add.o sub.o test.c -o test
注意:

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

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

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

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

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

例:make clean

test:add.o sub.o test.o
    gcc add.o sub.o test.c -o test
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -c test.c -o test.o
clean:
    rm *.o

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

test:add.o sub.o test.o
    gcc add.o sub.o test.c -o test
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -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.o

test:add.o sub.o test.o
    gcc $(SRC) -o test
add.o:add.c
    gcc -c add.c -o add.o
sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -c test.c sub.o test.o

#伪目标
.PHONY:clean
clean:
    rm *.o

注意:

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

2.

SRC=add.o sub.o test.o

test:add.o sub.o test.o
    gcc $(SRC) -o test

变量的赋值:

自动化变量:

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

隐含变量:

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

makefile的条件判断:

ifeq:

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

ifeq($(ARCH),X86)
CC=gcc

else

CC=arm-none-linux-gcc
endif

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

ifneq:

使用方式同ifeq,意思相反

ifdef:

使用方式ifdef开头,endif结尾

ifdef ARCH
CC=gcc

else

CC=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 MYFUN
    echo "*****"
endef

all:
    $(call MYFUN)

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

define MYFUN
    echo "*****"
    echo $(0)    //表示输出第一个参数
    echo $(1)    //表示输出第二个参数
    echo $(2)    //表示输出第三个参数
endef

all:
    $(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.o

test:add.o sub.o test.o
    gcc $(SRC) -o test
add.o:add.c
    gcc -c add.c -o add.o

    echo $*
    echo $@
    @echo $*
    @echo $@

sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -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:调试错误

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32-笔记3-驱动蜂鸣器

1、复制03项目&#xff0c;重命名为04项目 打开04项目的Drivers/BSP/led文件夹&#xff0c;把led文件夹更改为beep文件夹&#xff0c;改文件夹内部的.c和.h文件更改为beep.c和beep.h文件&#xff0c;如下图所示。 2、打开工程文件 出现弹窗&#xff0c;显示找不到xx文件&#…

阿尔茨海默症数据集,使用yolo,voc,coco格式对2013张原始图片进行标注,可识别轻微,中等和正常的症状

阿尔茨海默症数据集,使用yolo&#xff0c;voc&#xff0c;coco格式对2013张原始图片进行标注&#xff0c;可识别轻微&#xff0c;中等&#xff0c;严重和正常的症状 数据集分割 训练组100&#xff05; 2013图片 有效集&#xff05; 0图片 测试集&#xf…

uniapp v-tabs修改了几项功能,根据自己需求自己改

根据自己的需求都可以改 这里写自定义目录标题 1.数组中的名字过长&#xff0c;导致滑动异常2.change 事件拿不到当前点击的数据&#xff0c;通过index在原数组中查找得到所需要的id 各种字段麻烦3.添加指定下标下新加红点显示样式 1.数组中的名字过长&#xff0c;导致滑动异常…

k8s kubernetes

文章目录 CGroupk8s运行时k8s组件k8s组件安装kubeadm命令kubectl命令k8s官网代码 CGroup 在 Linux 上&#xff0c;控制组&#xff08;CGroup&#xff09;用于限制分配给进程的资源。kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、…

学习笔记072——Java中的【JUC 并发编程】

文章目录 JUC 并发编程1、什么是高并发2、Java 实现多线程的第三种方式3、sleep 和 wait 方法的区别4、synchronized 锁定的是谁&#xff1f;5、ConcurrentModificationException6、JUC 工具类7、读写锁8、线程池 JUC 并发编程 JUC 是指 Java 并发编程工具包 java.util.concu…

【报错解决】vsvars32.bat 不是内部或外部命令,也不是可运行的程序或批处理文件

报错信息&#xff1a; 背景问题&#xff1a;Boost提示 “cl” 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件时&#xff0c;   按照这篇博客的方法【传送】添加了环境变量后&#xff0c;仍然报错&#xff1a; 报错原因&#xff1a; vsvars32.bat 的路径不正…

简单配置,全面保护:HZERO审计服务让安全触手可及

HZERO技术平台&#xff0c;凭借多年企业资源管理实施经验&#xff0c;深入理解企业痛点&#xff0c;为您提供了一套高效易用的审计解决方案。这套方案旨在帮助您轻松应对企业开发中的审计挑战&#xff0c;确保业务流程的合规性和透明度。 接下来&#xff0c;我将为大家详细介绍…

使用nvm对node进行多版本管理

1.nvm下载及安装 下载链接 下载完成后&#xff0c;对文件进行解压安装&#xff0c;按照提示一步步安装&#xff0c;如果电脑上之前有安装过node&#xff0c;需要先卸载&#xff0c;再进行安装。 按照提示完成安装。 2.设置环境变量 可以现在C:\Users\name\AppData\Roamin…

【JavaEE初阶】JavaScript相应的WebAPI

目录 &#x1f332;WebAPI 背景知识 &#x1f6a9;什么是 WebAPI &#x1f6a9;什么是 API &#x1f38d;DOM 基本概念 &#x1f6a9;什么是 DOM &#x1f6a9;DOM 树 &#x1f340;获取元素 &#x1f6a9;querySelector &#x1f6a9;querySelectorAll &#x1f384…

基于MNE的EEGNet 神经网络的脑电信号分类实战(附完整源码)

利用MNE中的EEG数据&#xff0c;进行EEGNet神经网络的脑电信号分类实现&#xff1a; 代码&#xff1a; 代码主要包括一下几个步骤&#xff1a; 1&#xff09;从MNE中加载脑电信号&#xff0c;并进行相应的预处理操作&#xff0c;得到训练集、验证集以及测试集&#xff0c;每个…

SCHEMA find old payroll result

这几天原来HK客户要我帮忙看一个问题&#xff0c;在看HK雇佣条例时&#xff0c;发现又假期是取前12个月的工资&#xff0c;后来查看标准函数发现两个有用的operation&#xff0c;PLOOP与IMPRE 下图是2012年6月工资核算&#xff0c;现在循环着前面4个月。 输入 输出 2012年5月…

【ARM Trace32(劳特巴赫) 使用介绍 1 -- Trace32 debug 工具安装详细步骤】

文章目录 Trace32 工具解压查看安装手册准备安装设置安装目录指定安装目录选择安装类型:选择平台架构开始安装Trace32 应用打开使用界面Trace32 工具解压 使用 7-zip 解压两次: 查看安装手册 安装步骤按照文档中的 1、2、3 进行: 在解压文件中找到安装工具,如下: 准备…

Flux Tools 结构简析

Flux Tools 结构简析 BFL 这次一共发布了 Canny、Depth、Redux、Fill 四个 Tools 模型系列&#xff0c;分别对应我们熟悉的 ControlNets、Image Variation&#xff08;IP Adapter&#xff09;和 Inpainting 三种图片条件控制方法。虽然实现功能是相同的&#xff0c;但是其具体…

【物联网技术与应用】实验3:七彩LED灯闪烁

实验3 七彩LED灯闪烁 【实验介绍】 七彩LED灯上电后&#xff0c;7色动闪光LED模块可自动闪烁内置颜色。它可以用来制作相当吸引人的灯光效果。 【实验组件】 ● Arduino Uno主板* 1 ● USB数据线* 1 ● 7彩LED模块*1 ● 面包板*1 ● 9V方型电池*1 ● 跳线若干 【实验原…

Web 安全必读:跨站脚本攻击 (XSS) 原理与防御指南

文章目录 原理解析&#xff1a;触发方式 文件内容中的xss文件名中的xssHTTP请求中的xss其他 分类&#xff1a; 根据攻击脚本存储的方式根据脚本是否通过服务器处理根据持久性 常见的js触发标签 无过滤情况有过滤情况 xss-labs通关 level1-level10level11-level20 XSS&#x…

Set集合进行!contains判断IDEA提示Unnecessary ‘contains()‘ check

之前写过一个代码&#xff0c;用到了Set集合&#xff0c;判断了如果某个元素不存在就添加到集合中。今天翻看代码又看到了IDEAUnnecessary contains() check爆黄提示。 来一段测试代码&#xff1a; public class SetTest {public static void main(String[] args) {Set<Int…

Mapper代理开发

引入 Mybatis入门方式中&#xff0c;以下代码仍存在硬编码问题 Mapper 代理开发&#xff1a; 目的&#xff1a; 解决原生方式中的硬编码 简化后期执行sql ------下图中&#xff0c;第一段代码是原生硬编码代码块&#xff0c;第二个是引入了Mapper代理开发的代码块。 Mapper代…

abc 384 D(子数组->前缀和) +E(bfs 扩展的时候 按照数值去扩展)

D 做出来的很开心&#xff0c;好像本来就应该做出来>< 思路&#xff1a; 对于连续的子序列&#xff08;也就是 子数组&#xff09; 一般都和 前缀和 后缀和 有关系 区间[l r] 可以用 前缀 S_r -S{l-1} tar来表示。(对于两个元素等于一个数字&#xff0c;就可以枚举一个&…

【2024版】最新推荐好用的XSS漏洞扫描利用工具_xss扫描工具

工具介绍 toxssin 是一种开源渗透测试工具&#xff0c;可自动执行跨站脚本 (XSS) 漏洞利用过程。它由一个 https 服务器组成&#xff0c;它充当为该工具 (toxin.js) 提供动力的恶意 JavaScript 有效负载生成的流量的解释器。 安装与使用 1、安装需要的依赖库 git clone http…

web网页前后端交互方式

参考该文&#xff0c; 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单&#xff0c;设置method属性定义发送表单数据的方式是get还是post。 如使用get方式&#xff0c;则提交的数据会在url中显示&#xff1b;如使用post方式&#xff0c;提交…