首页 > 其他分享 >Makefile学习笔记

Makefile学习笔记

时间:2023-08-25 21:56:34浏览次数:39  
标签:gcc sub Makefile 笔记 学习 add div main mult

规则:每条规则由三个部分组成分别是目标(target), 依赖(depend)和命令(command)。

#示例
# 规则1
app:a.o b.o c.o
    gcc a.o b.o c.o -o app
# 规则2
a.o:a.c
    gcc -c a.c
# 规则3
b.o:b.c
    gcc -c b.c
# 规则4
c.o:c.c
    gcc -c c.c

 

makefile有自动推导功能,有时漏写一些构建规则,但是程序还是会被编译

# 这是一个完整的 makefile 文件
calc:add.o  div.o  main.o  mult.o  sub.o
        gcc  add.o  div.o  main.o  mult.o  sub.o -o calc

 

借助自定义变量名写makefile

#普通写法
calc:add.o  div.o  main.o  mult.o  sub.o
        gcc  add.o  div.o  main.o  mult.o  sub.o -o calc
        
#使用了自定义变量写法
obj=add.o  div.o  main.o  mult.o  sub.o
target=calc
$(target):$(obj)
        gcc  $(obj) -o $(target)

 

预定义变量:在 Makefile 中有一些已经定义的变量,用户可以直接使用这些变量,不用进行定义。在进行编译的时候,某些条件下 Makefile 会使用这些预定义变量的值进行编译

#CC    C 语言编译器的名称    cc
#普通写法
calc:add.o div.o main.o mult.o sub.o
gcc add.o div.o main.o mult.o sub.o -o calc

#使用了自定义变量和预定义变量的写法
obj=add.o div.o main.o mult.o sub.o
target=calc
CFLAGS=-O3 # 代码优化
$(target):$(obj)
$(CC) $(obj) -o $(target) $(CFLAGS)

自动变量:

$@	表示目标文件的名称,包含文件扩展名
$^	依赖项中,所有不重复的依赖文件,这些文件之间以空格分开
$< 表示依赖项中第一个依赖文件的名称
#示例
#普通写法 calc:add.o div.o main.o mult.o sub.o gcc add.o div.o main.o mult.o sub.o -o calc # 使用自动变量, 替换相关的内容 calc:add.o div.o main.o mult.o sub.o gcc $^ -o $@ # 自动变量只能在规则的命令中使用

makefile里的函数:

wildcard:获取指定目录下指定类型的文件名,其返回值是以空格分割的、指定目录下的所有符合条件的文件名列表。

# 使用举例: 分别搜索三个不同目录下的 .c 格式的源文件
src = $(wildcard /home/robin/a/*.c /home/robin/b/*.c *.c)  # *.c == ./*.c
# 返回值: 得到一个大的字符串, 里边有若干个满足条件的文件名, 文件名之间使用空格间隔
/home/robin/a/a.c /home/robin/a/b.c /home/robin/b/c.c /home/robin/b/d.c e.c f.c

 

patsubst按照指定的模式替换指定的文件名的后缀,

#示例
src = a.cpp b.cpp c.cpp e.cpp # 把变量 src 中的所有文件名的后缀从 .cpp 替换为 .o obj = $(patsubst %.cpp, %.o, $(src)) # obj 的值为: a.o b.o c.o e.o

 

 练习

# 目录结构
├── include
│   └── head.h ==> 头文件, 声明了加减乘除四个函数
├── main.c ==> 测试程序, 调用了head.h中的函数
└── src
├── add.c ==> 加法运算
├── div.c ==> 除法运算
├── mult.c ==> 乘法运算
└── sub.c ==> 减法运算

# 最终的目标名 app
target = app
# 搜索当前项目目录下的源文件
src=$(wildcard *.c ./src/*.c)
# 将文件的后缀替换掉 .c -> .o
obj=$(patsubst %.c, %.o, $(src))
# 头文件目录
include=./include
$(target):$(obj)
        gcc $^ -o $@

# 模式匹配规则
# 执行汇编操作, 前两步: 预处理, 编译是自动完成
%.o:%.c
        gcc $< -c -I $(include) -o $@

# 添加一个清除文件的规则
.PHONY:clean

clean:
        -rm $(obj) $(target) -f

 

标签:gcc,sub,Makefile,笔记,学习,add,div,main,mult
From: https://www.cnblogs.com/ddrm/p/17658024.html

相关文章

  • 迁移学习:实现快速训练和泛化的新方法
    在机器学习和深度学习领域,训练一个高性能的模型通常需要大量的数据和计算资源。然而,现实中很多情况下,我们可能没有足够的数据或计算资源来训练一个复杂的模型。这时,迁移学习(TransferLearning)作为一种强大的技术手段,可以帮助我们在一个任务上训练好的模型,迁移到另一个相关任务上,从......
  • 《算法笔记》树与二叉树专题练习
    1、复原二叉树(由前序和中序求后序)题目描述小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。输入输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写......
  • [20230825]dc命令复杂学习.txt
    [20230825]dc命令复杂学习.txt--//前几天学习dc使用,我当时最后举了一个累加的例子,里面--//-e后面那一串什么意思,即使看了mandc文档,我当时也没看懂表示什么意思.尝试看了man文档,简单解析如下:--//我从文档里面取出相关说明:[characters]Makesastringcontainingcharacters......
  • 【学习笔记】二维偏序
    看着名字挺高级的就来学一下awa二维偏序是解决这样子的问题:有\(n\)个点,每一个点都有两个属性\(a,b\),且满足\[\left\{\begin{aligned}&i<j\\&a_i\lea_j\\&b_i\leb_j\end{aligned}\right.\]然后去求一些奇奇怪怪的问题解法是离散化后排序然后用两个树状数组来维护......
  • mysql 深入学习一 数据结构导图
    索引的本质 B-Tree结构 B+Tree结构 Hash结构  MyISAM存储引擎索引实现 innodb存储引擎实现 innodb引擎生成两个文件,将索引文件和数据文件都放在的.ibd文件下(这就是聚集索引)myisam引擎生成三个文件,将索引和数据分开保存分别在.MYD.MYI文件下(这就是非聚......
  • 杂题笔记
    CF11DASimpleTask题意给定一个\(n\)个点\(m\)条边的简单无向图,询问里面有多少个简单环。\(n\leq19\)解法对于每一个环,用唯一确定的方法去标记他。(寻找另一种更容易统计的对象,让这种对象可以唯一对应一个环)我们可以找到这个环里面编号最小的点,分别从这个点的左侧和......
  • STM32深入学习3:DMA,串口通信和看门狗
    DMADMA直接存储器存取,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA1有7个通道,DMA2有5个通道,还有一个仲裁器来协调各个DMA请求的优先权。DMA的作用是实现数据的直接传输,从地址到地址的数据传输。DMA传输的相关参数:源地址,目标地址,数据传输量,传输模式......
  • 【论文解读】基于图的自监督学习联合嵌入预测架构
    一、简要介绍 本文演示了一种学习高度语义的图像表示的方法,而不依赖于手工制作的数据增强。论文介绍了基于图像的联合嵌入预测架构(I-JEPA),这是一种用于从图像中进行自监督学习的非生成性方法。I-JEPA背后的idea很简单:从单个上下文块中,预测同一图像中不同目标块的表示。指导I-JEP......
  • openGauss学习笔记-50 openGauss 高级特性-DB4AI
    openGauss学习笔记-50openGauss高级特性-DB4AIopenGauss当前版本支持了原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注......
  • 吃透这份阿里P7大佬整理的《Android Framework源码笔记》,还怕找不到工作?
    前言随着Android开发行业的快速发展,市场需求也在不断提升,导致低端Android开发市场就业大环境不好、行业趋势下滑,使得不少初中级的Android开发开始失业,找不到工作。对于大部分的开发者来说,找不到工作的一大部分原因,是因为AndroidFramework无法做到精通。想要成为真正的高级Androi......