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

makefile01

什么是makefile

Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目。一旦写编写好 Makefile 文件,只需要一个 make 命令,整个工程就开始自动编译,不再需要手动执行 GCC 命令。一个中大型 C/C++ 工程的源文件有成百上千个,它们按照功能、模块、类型分别放在不同的目录中,Makefile 文件定义了一系列规则,指明了源文件的编译顺序、依赖关系、是否需要重新编译等。

Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

make 和 makefile 的关系

make是一个命令工具,它解释Makefile中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。

Cmake 是什么

CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。

CMake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

Cmake与CMakeLists的关系

cmake是一个命令工具,可用来生成makefile。但也要根据CMakelists.txt中的内容来生成,CMakeLists.txt就是写给cmake的规则她.

注意

make是一个命令工具,Makefile是一个文件,make执行的时候侯,去读取Makefile文件中的规则,重点是makefile得自己写。
cmake是一个命令工具,CMakelists.txt是一个文件,Cmake执行的时候,去读取CMakelists.txt文件中的规则,重点是CMakelists.txt得自自己写。

hello world 开始

Makefile基本语法
目标:依赖
Tab 命令
在这里插入图片描述
在这里插入图片描述
目标:一般是指要编译的目标,也可以是一个动作
依赖:指执行当前目标所要依赖的先项,包括其它目标,某个具体文件或库等
一个目标可以有多个依赖
命令:该目标下要执行的具体命令,可以没有,也可以有多条
多条时,每条命令一行

在这里插入图片描述

在这里插入图片描述
添加依赖:
在这里插入图片描述
在这里插入图片描述
添加多条语句:
在这里插入图片描述
在这里插入图片描述
make clean:
在这里插入图片描述
在这里插入图片描述
添加 @ 执行时不会输出:

clean:@rm -rf a.out

可以自己添加注释输出:

clean:@rm -rf a.out@echo "rm -rf a.out ok"

make常用选项
make [-f file][options][target]
Make默认在当前目录中寻找GUNmakefile,makefile,Makefile的文件作为make的输入文件
-f 可以指定除上述文件名之外的文件作为输入文件
-v 显示版本号
-n 只输出命令,但并不执行,一般用来测试
-s 只执行命令,但不显示具体命令,此处可在命令中用@符抑制命令输出
-w 显示执行前执行后的路径
-Cdir 指定makefile所在的目录
没有指定目标时,默认使用第一个目标
如果指定,则执行对应的命令

编译流程

创建文件
在这里插入图片描述
在这里插入图片描述

make./calculate 

优化
好处:
第一次编译两小时
第二次编译五分钟

# calculate: clean
# 	gcc main.cpp add.cpp mult.cpp div.cpp sub.cpp -o calculate# clean:
# 	rm -rf calculatecalculate:clean add.o sub.o mult.o div.ogcc add.o sub.o mult.o div.o main.cpp -o calculateadd.o:add.cpp gcc -c add.cpp -o add.osub.o:sub.cpp gcc -c sub.cpp -o sub.omult.o:mult.cppgcc -c mult.cpp -o mult.odiv.o:div.cpp gcc -c div.cpp -o div.oclean:rm -rf calculate

gcc main.cpp直接从源代码到目标可执行文件了
把过程拆分
预处理 gcc -E main.cpp>main.ii
编译 gcc -S main.ii得到名为main.s的汇编文件
汇编 gcc -c main.s得到名为main.o(.obj)的二进制文件
链接 gcc main.o得到名为a.out 的可执行文件

在这里插入图片描述

Makefile中的变量

  • 系统变量
    $* 不包括扩展名的目标文件名称
    $< 所有的依赖文件,以空格分隔
    $表示规则中的第一个条件
    $?所有时间戳比目标文件晚的依赖文件,以空格分隔
    $@目标文件的完整名称
    $^ 所有不重复的依赖文件,以空格分隔
    $%如果目标是归档成员,则该变量表示目标的归档成员名称

  • 系统常量(make -p可查看)
    AS 汇编程序的名称,默认为 as
    CC C编译器名称 默认cc
    CPP C预编译器名称 默认cc -E
    CXX C++编译器名称 默认g++
    RM 文件删除程序别名 默认rm-f

show:echo $(AS)echo $(CC)echo $(CPP)echo $(CXX)echo $(RM)

在这里插入图片描述
在这里插入图片描述

  • 自定义变量
    自定义 = 参数
    TARGET = calculate
    使用:
    $(TARGET)

OBJ = add.o sub.o mult.o div.o calc.o 
TARGET = calculate$(TARGET):$(OBJ)gcc $(OBJ) -o $(TARGET)add.o:add.cpp gcc -c add.cpp -o add.osub.o:sub.cpp gcc -c sub.cpp -o sub.omult.o:mult.cppgcc -c mult.cpp -o mult.odiv.o:div.cpp gcc -c div.cpp -o div.ocalc.o:calc.cpp gcc -c calc.cpp -o calc.oclean:rm -rf calculate *.o

变量替换


OBJ = add.o sub.o mult.o div.o calc.o 
TARGET = calculate$(TARGET):$(OBJ)$(CXX) $^ -o $@add.o:add.cpp $(CXX) -c $^ -o $@sub.o:sub.cpp $(CXX) -c $^ -o $@mult.o:mult.cpp$(CXX) -c $^ -o $@div.o:div.cpp $(CXX) -c $^ -o $@calc.o:calc.cpp $(CXX) -c $^ -o $@clean:$(RM) $(TARGET) *.oshow:echo $(AS)echo $(CC)echo $(CPP)echo $(CXX)echo $(RM)

在这里插入图片描述

伪目标和模式匹配

伪目标.PHONY:clean
声明目标为伪目标之后,mokefile将不会判断目标是否存在或该目标是否需要更新

执行make clean 会删除文件
这时在当前目录下创建一个名为clean的文件
再次执行make clean 提示
make: ‘clean’ is up to date.
在这里插入图片描述
解决方法
添加为伪目标

.PHONY:clean 

在这里插入图片描述

按照OBJ顺序来的

在这里插入图片描述
%.0:%.cpp .0依赖于对应的.cpp
wildcard $(wildcard ./*.cpp)获取当前目录下所有的.cpp文件
patsubst $(patsubst %.cpp,%.o,/*cpp)将对应的cpp文件名替换成.0文件名
在这里插入图片描述
使用

# OBJ = add.o sub.o mult.o div.o calc.o 
OBJ = $(patsubst %.cpp,%.o,$(wildcard ./*.cpp))

在这里插入图片描述

报错

在这里插入图片描述
问题
make: show: No such file or directory
make: *** [Makefile:37: show] Error 127
解决
使用echo

运行流程

保证目标是用最新的依赖生成的
第一次全完编译,后面只编译最新的代码(部份编译)
在这里插入图片描述

在这里插入图片描述

学习参考

https://www.bilibili.com/video/BV1Xt4y1h7rH/?p=5&spm_id_from=pageDriver&vd_source=e70917aa6392827d1ccc8d85e19e8375

相关文章:

makefile01

什么是makefile Makefile 文件描述了 Linux 系统下 C/C 工程的编译规则&#xff0c;它用来自动化编译 C/C 项目。一旦写编写好 Makefile 文件&#xff0c;只需要一个 make 命令&#xff0c;整个工程就开始自动编译&#xff0c;不再需要手动执行 GCC 命令。一个中大型 C/C 工程…...

计算机视觉之三维重建(6)---多视图几何(上)

文章目录 一、运动恢复结构问题&#xff08;SfM&#xff09;二、欧式结构恢复2.1 概述2.2 求解2.3 欧式结构恢复歧义 三、仿射结构恢复3.1 概述3.2 因式分解法3.3 总结3.4 仿射结构恢复歧义 一、运动恢复结构问题&#xff08;SfM&#xff09; 1. 运动恢复结构问题&#xff1a;通…...

蓝桥杯:全球变暖(python,BFS,DFS)(栈溢出的处理办法)

图论的经典题型&#xff0c;深度优先搜索和广度优先搜索都可以&#xff0c;但是本题推荐使用广度优先搜索&#xff08;类似的题最好都用广度优先搜索&#xff09;&#xff0c;因为使用深度优先搜索会爆栈&#xff08;栈溢出&#xff09;。本篇博客两种方法都进行讲解&#xff0…...

Qt C++ | Qt 元对象系统、信号和槽及事件(第一集)

01 元对象系统 一、元对象系统基本概念 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C++进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使用元…...

Python 抽象类

在Python的抽象基类(ABC)中,方法并不是必须全部是抽象方法。抽象基类可以同时包含抽象方法和具体方法。抽象类中可以有抽象方法也可以定义具体方法 具体来说: 抽象方法: 使用abc.abstractmethod装饰器标记的方法是抽象方法。抽象方法没有方法体,只有方法签名。抽象方法必须在具…...

达梦数据库自动备份(全库)+还原(全库) 控制台

一 前提 1.安装达梦数据库DB8(请参照以前文章) 我的数据库安装目录是 /app/dmDB8 2.已创建实例 (请参照上一篇文章) 二 准备测试数据 三 自动备份步骤 1.开启归档模式 开启DM管理工具管理控制台 弹不出来工具的 输入命令 xhost 第一步 将服务器转换为配置状态 右键-&g…...

android AndroidAutoSize 取消第三方库适配问题(两个步骤)

比如第三方库的Activity是&#xff1a;PictureSelectorSupporterActivity、PictureSelectorTransparentActivity、CropImageActivity 1.在自定义Application 的 onCreate 方法设置&#xff1a; Overridepublic void onCreate() {super.onCreate();this.mAppthis;registerActi…...

【Java 多线程】从源码出发,剖析Threadlocal的数据结构

文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类&#xff0c;里面数据结构的设计很有意思&#xff0c;很巧妙。但是我们平时使用它的时候常常容易对它的使用…...

Sy6 编辑器vi的应用(+shell脚本3例子)

实验环境&#xff1a; 宿主机为win11&#xff0c;网络&#xff1a;10.255.50.5 6389 WSL2 ubuntu 目标机的OS&#xff1a;Ubuntu 内核、版本如下&#xff1a; linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…...

把标注数据导入到知识图谱

文章目录 简介数据导入Doccano标注数据&#xff0c;导入到Neo4j寻求帮助 简介 团队成员使用 Doccano 标注了一些数据&#xff0c;包括 命名实体识别、关系和文本分类 的标注的数据&#xff1b; 工作步骤如下&#xff1a; 首先将标注数据导入到Doccano&#xff0c;查看一下标注…...

【前端基础】什么是类数组对象,类数组对象转换成数组的方法

类数组对象&#xff08;array-like object&#xff09;是指在 JavaScript 中具有类似数组的特征但不是真正的数组的对象。这些对象具有类似数组的特性&#xff0c;例如有一个 length 属性和通过索引访问元素的能力&#xff0c;但它们不具备数组对象的所有方法和特性。 什么是类…...

Python快速入门系列-8(Python数据分析与可视化)

第八章:Python数据分析与可视化 8.1 数据处理与清洗8.1.1 数据加载与查看8.1.2 数据清洗与处理8.1.3 数据转换与整理8.2 数据可视化工具介绍8.2.1 Matplotlib8.2.2 Seaborn8.2.3 Plotly8.3 数据挖掘与机器学习简介8.3.1 Scikit-learn8.3.2 TensorFlow总结在本章中,我们将探讨…...

双非硕转测试之Java学习笔记(一):集合

Java学习-----集合 简单概括单列集合--collectionlist接口&#xff1a;vector类&#xff1a;LinkedList类&#xff1a;set接口&#xff1a;HasSet类&#xff1a;LinkedHashSet类&#xff1a; 双列集合--MapMap接口&#xff1a;HashMap类&#xff1a;HashTable类&#xff1a;Pro…...

zabbix源码安装

目录 一.安装php和nginx客户端环境 二.修改php配置 三.修改nginx配置文件 四.下载并编译zabbix 五.创建zabbix需要的用户及组 六.安装编译需要的依赖 七.配置zabbix文件 八.数据库配置 九.配置zabbix 十.web界面部署 十一.遇到无法创建配置文件 十二.登录zabbix 前…...

计算机视觉之三维重建(5)---双目立体视觉

文章目录 一、平行视图1.1 示意图1.2 平行视图的基础矩阵1.3 平行视图的极几何1.4 平行视图的三角测量 二、图像校正三、对应点问题3.1 相关匹配法3.2 归一化相关匹配法3.3 窗口问题3.4 相关法存在的问题3.5 约束问题 一、平行视图 1.1 示意图 如下图即是一个平行视图。特点&a…...

计算机网络-TCP/IP 网络模型

TCP/IP网络模型各层的详细描述&#xff1a; 应用层&#xff1a;应用层为应用程序提供数据传输的服务&#xff0c;负责各种不同应用之间的协议。主要协议包括&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;用于从web服务器传输超文本到本地浏览器的传送协议。FTP&…...

算法训练营第29天|LeetCode 491.递增子序列 46.全排列 47.全排列Ⅱ

LeetCode 491.递增子序列 题目链接&#xff1a; LeetCode 491.递增子序列 解题思路&#xff1a; 用哈希集合进行去重&#xff0c;同一树层不能取重复元素。 代码&#xff1a; class Solution { public:vector<vector<int>>result;vector<int>path;void…...

Ubuntu服务器搭建 - 环境篇

Ubuntu服务器搭建 - 环境篇 基于腾讯云服务器 - Ubuntu 20.04 LTS 一、安装 - MySQL 1.1 概述 MySQL安装方式有三种: 1. 使用Ubuntu 包管理工具 apt安装 2. 使用MySQL官方APT存储库安装 3. 使用MySQL官方二进制发行版安装 1.2 安装 MySQL 使用MySQL官方APT存储库安装 $ wget…...

深度学习基础模型之Mamba

Mamba模型简介 问题&#xff1a;许多亚二次时间架构(运行时间复杂度低于O(n^2)&#xff0c;但高于O(n)的情况)&#xff08;例如线性注意力、门控卷积和循环模型以及结构化状态空间模型&#xff08;SSM&#xff09;&#xff09;已被开发出来&#xff0c;以解决 Transformer 在长…...

Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件

Topaz Video AI for Mac是一款功能强大的视频处理软件&#xff0c;专为Mac用户设计&#xff0c;旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术&#xff0c;能够自动识别和分析视频中的各个元素&#xff0c;并进行智能修复和增强&…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

深度解析云存储:概念、架构与应用实践

在数据爆炸式增长的时代&#xff0c;传统本地存储因容量限制、管理复杂等问题&#xff0c;已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性&#xff0c;成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理&#xff0c;云存储正重塑数据存储与…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...

STL 2迭代器

文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器&#xff1f; 1.迭代器…...