Makefile快速上手

Makefile学习

https://maxwell-lx.vip/basic-usage-make/

https://zhuanlan.zhihu.com/p/92010728

https://zhuanlan.zhihu.com/p/350297509

一、是什么

可以理解为一个自动化的编译脚本,避免繁琐的手动编译过程。有点类似shell脚本。

1.1 从小例子入手

(1)新建项目文件夹hello,及文件main.cppfactorial.cppprinthello.cppfunctions.h

hello目录的结构如下:

hello/
├──main.cpp
├──factorial.cpp
├──printhello.cpp
└──functions.h

main.cpp

#define _FUNCTIONS_H_#include <iostream>
#include "functions.h"
using namespace std;int main()
{printhello();cout << "This is main:" << endl;cout << "The factorial of 5 is:" << factorial(5) << endl;return 0;
}

printhello.cpp

#include <iostream>
#include "functions.h"
using namespace std;void printhello()
{int i;cout << "Hello World!" << endl;
}

factorial.cpp

#include "functions.h"int factorial(int n)
{if (n==1)return 1;elsereturn n * factorial(n-1);
}

function.h

#ifdef _FUNCTIONS_H_
#define _FUNCTIONS_H_
void printhello();
int factorial(int n);
#endif

(2)那么我们一般手动执行的命令为:

g++ main.cpp factorial.cpp printhello.cpp -o main
./main

这种方法适用于小型项目。对于大型项目来说,此法编译效率低,

(3)新建Makefile

hello: main.cpp printhello.cpp factorial.cppg++ -o hello main.cpp printhello.cpp factorial.cpp

在命令行上直接运行make命令就能出现hello可执行文件

二、Makefile解析

2.1 大致了解一个Makefile

对于一个初学者,大概浏览一个makefile:

1、区分前处理/变量处理(根据规则定义或处理参数) 。

2、找到target: 包含了冒号(colon :)。arget都是顶格抒写的, " : <***> " , target下面的带[tab]缩进的行,就是它包含的命令,找到所有的target。

3、执行target: 一般是实现第一个target,(也可以用make 指定,如make clean,就只执行"clean" 这个target)。

2.2 Makefile的语法

简单的分为三个部分:目标、依赖、命令

[目标]: [依赖]
(tab制表符)[命令]
  • 目标:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;
  • 依赖:可以是生成 targets 需要的文件或者是目标。可以是多个,也可以是没有;
  • 命令:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。

2.3 工作原理

从第一个target开始,检查它的依赖是否都存在,如果存在的话就执行当前target下的命令。

否则就往下查找,寻找新规则生成依赖。

三、实战

3.1 version1

hello: main.cpp printhello.cpp factorial.cppg++ -o hello main.cpp printhello.cpp factorial.cpp

版本1就相当于普通的编译命令。

3.2 version2

CXX = g++
TARGET = hello 
OBJ = main.o printhello.o factorial.o$(TARGET): $(OBJ)$(CXX) -o $(TARGET) $(OBJ)main.o: main.cpp$(CXX) -c main.cppprinthello.o: printhello.cpp$(CXX) -c printhello.cppfactorial.o: factorial.cpp$(CXX) -c factorial.cpp

版本2分离编译器、目标、对象,但是还是不够智能。增加一个cpp文件需要改动的地方很多。

3.3 version3

CXX = g++
CXXFLAGS = -c -Wall
TARGET = hello 
OBJ = main.o printhello.o factorial.o$(TARGET): $(OBJ)$(CXX) -o $@ $^%.o: %.cpp$(CXX) $(CXXFLAGS) $< -o $@.PHONY: clean
clean:rm -f *.o $(TARGET)

版本3引入了自动变量、通配符、.PONY

(1)自动变量小撇:

目标: 依赖
  • $@ 目标名
  • $^ 所有依赖的文件名
  • $< 第一个依赖的文件名

(2)通配符%,匹配0个或多个任意字符。

(3).PHONY的作用比较特殊,跟在它后面的目标都被称为伪目标

如果 make 伪目标,不管该目录下是否有伪目标同名的文件(即使有也不会产生冲突),都会执行执行伪目标的依赖的命令。

3.4 version4

CXX = g++
TARGET = hello 
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC))CXXFLAGS = -c -Wall$(TARGET): $(OBJ)$(CXX) -o $@ $^%.o: %.cpp$(CXX) $(CXXFLAGS) $< -o $@.PHONY: clean
clean:rm -f *.o $(TARGET)

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

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

相关文章

SQLAlchemy常用数据类型

目录 SQLAlchemy常用数据类型 代码演示 代码分析 SQLAlchemy常用数据类型 SQLAlchemy 是一个Python的SQL工具库和对象关系映射(ORM)工具&#xff0c;它提供了一种在Python中操作数据库的高效方式。下面是SQLAlchemy中常用的一些数据类型&#xff1a; Integer&#xff1a;整形&…

静态路由+BFD实例

项目拓扑与项目需求 项目需求 ① 主链路为电信&#xff0c;电信链路出故障时&#xff0c;业务数据流量切换到联通链路 实验步骤 步骤1&#xff1a;设备重命名以及IP地址的配置 设备 接口编号 IP地址 AR1 G0/0/0 10.0.13.1/24 G0/0/1 10.0.14.1/24 AR2 G0/0/0 10.0…

中国JP-10燃料行业市场研究与预测报告(2023版)

内容简介&#xff1a; 高密度燃料是指以石油基、煤基和生物质基烃类为原料&#xff0c;通过聚合、加氢、异构等工艺合成的密度大于0.85 gcm-3的饱和多环碳氢化合物&#xff0c;广泛应用于航空航天领域。由于高密度燃料密度大和体积热值高等特点&#xff0c;飞行器在油箱体积一…

LuatOS-SOC接口文档(air780E)-- fota - 底层固件升级

fota.init(storge_location, len, param1)# 初始化fota流程 参数 传入值类型 解释 int/string fota数据存储的起始位置 如果是int&#xff0c;则是由芯片平台具体判断 如果是string&#xff0c;则存储在文件系统中 如果为nil&#xff0c;则由底层决定存储位置 int 数据存…

Windows 下安装及配置 MySQL 8.1 (图文教程)

目录 下载 MySQL安装 MySQL配置 MySQL修改密码配置环境变量 卸载 MySQL开源项目微服务商城项目前后端分离项目 下载 MySQL 访问 MySQL 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 下载 MySQL 时&#xff0c;你可以选择 ZIP 包或 MSI 安装&#xff1a; ZIP包…

十六,镜面IBL--预滤波环境贴图

又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分&#xff0c;镜面反射。 其中 这里很棘手&#xff0c;与输入wi和输出w0都有关系&#xff0c;所以&#xff0c;再近似 其中第一部分&#xff0c;就是预滤波环境贴图&#xff0c;形式上与前面的辐照度图很相似&#…

安达发|印刷包装行业利用APS自动排产系统迎来绿色革命

随着环保意识的不断提高&#xff0c;印刷包装行业也在寻求绿色发展之路。近年来&#xff0c;该行业在材料研发、生产工艺等方面取得了显著成果&#xff0c;为实现可持续发展奠定了基础。 印刷包装行业作为现代工业的重要组成部分&#xff0c;其发展水平直接影响到国民经济的整体…

SpringBoot 学习(二)配置

2. SpringBoot 配置 2.1 配置文件类型 配置文件用于修改 SpringBoot 的默认配置。 2.1.1 properties 文件 **properties ** 是属性文件后缀。 文件名&#xff1a;application.properties 只能保存键值对。 基础语法&#xff1a;keyvalue namewhy注入配置类 Component //…

为什么u盘在mac上显示不出来

插入U盘是个看似简单的操作&#xff0c;但有时候在Mac电脑上却出现了无法显示U盘的情况。这样的问题是非常让人头疼的&#xff0c;特别是当你急需使用U盘中的文件时。那么&#xff0c;究竟为什么U盘在Mac上会显示不出来呢&#xff1f;今天就让我们一起来深入了解一下这个问题&a…

智慧燃气平台的总体架构到底应怎样设计?

关键词&#xff1a;智慧燃气、智慧燃气平台、智能燃气、智能监控 智慧燃气平台功能设计的一些方向和思考&#xff1a; 1、资源统一&#xff0c;管理调度 城市燃气智慧调度运营管理平台收集并且整理出每个业务系统信息&#xff0c;并且根据所整理出的信息结果制定出标准规范&…

2023-09-28力扣每日一题-差分

链接&#xff1a; 2251. 花期内花的数目 题意 n朵花&#xff0c;有n个花期&#xff0c;m个人在m个时间来&#xff0c;求每个时间有多少朵花 解&#xff1a; 通过差分确定一个时间段内的花数量 再通过离线查询&#xff08;因为返回答案数组&#xff09;进行记忆存储&#…

JAVA中使用CompletableFuture进行异步编程

JAVA中使用CompletableFuture进行异步编程 1、什么是CompletableFuture CompletableFuture 是 JDK8 提供的 Future 增强类&#xff0c;CompletableFuture 异步任务执行线程池&#xff0c;默认是把异步任 务都放在 ForkJoinPool 中执行。 在这种方式中&#xff0c;主线程不会…

冲刺十五届蓝桥杯P0001阶乘求和

文章目录 题目描述思路分析代码解析 题目描述 思路分析 阶乘是蓝桥杯中常考的知识。 首先我们需要知道 int 和long的最大值是多少。 我们可以知道19的阶乘就已经超过了long的最大值&#xff0c;所以让我们直接计算202320232023&#xff01;的阶乘是不现实的。 所以我们需要…

DAP-seq在植物转录因子的应用案例助你打通研究思路

众所周知&#xff0c;转录因子 (Transcription Factors, TFs)是指能够以序列特异性方式结合DNA并且调节转录的蛋白质。TF与特异性DNA序列结合调节转录&#xff0c;同时会和其它功能蛋白结合调控下游基因的转录和翻译过程&#xff0c;也会和增强子等其它顺式作用元件结合&#x…

部署Kafka

kafka&#xff1a;kafka_2.13-3.5.1 NOTE: Your local environment must have Java 8 installed. Apache Kafka can be started using ZooKeeper or KRaft. To get started with either configuration follow one the sections below but not both. 1 Windows单机 1.1 Kafka w…

ClickHouse分布式集群部署

目录 ​编辑 一、环境说明 二、安装部署 2.1 RPM方式安装 2.1.1 安装yum-utils 2.1.2 配置yum repo源 2.1.3 yum install 下载安装clickhouse 2.2 信息配置 2.2.1 配置外网可访问地址 2.2.2 修改存储路径 2.2.2.1 新建存储目录 2.2.2.2 授权 2.2.2.3 修改配置 2.…

从技能需求到就业前景,了解前端和后端开发的优缺点和个人选择

文章目录 每日一句正能量一、引言前端开发后端开发 二、两者的对比分析三、技能转换和跨领域工作四&#xff1a;介绍全栈开发后记 每日一句正能量 命运决定的不是你的人生&#xff0c;能决定你人生的只有自己。 一、引言 前端和后端是Web开发中两个不可或缺的领域。前端开发主…

人工智能:ChatGPT与其他同类产品的优缺点对比

引言&#xff1a;自然语言处理技术的快速发展推动了聊天机器人的广泛应用。ChatGPT作为一种强大的语言模型&#xff0c;具有出色的生成能力和上下文理解能力。本文将对比ChatGPT与其他同类产品的优缺点&#xff0c;并展示使用ChatGPT进行对话生成的示例代码。 ChatGPT简介 Cha…

铁路用热轧钢轨

声明 本文是学习GB-T 2585-2021 铁路用热轧钢轨. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了铁路用钢轨的订货内容、分类、尺寸、外形、质量及允许偏差、技术要求、试验方法、检 验规则、标志及质量证明书。 本标准适用于3…

曙光亮相工博会,发布首款国产高端工业实时仿真计算系统

9月19日-23日&#xff0c;中科曙光亮相第23届中国国际工业博览会&#xff0c;并受邀于主论坛发表主题演讲&#xff0c;在工业权威会议上展示曙光领先的工业数字化技术与实践成果。展会期间&#xff0c;曙光重磅发布首款国产工业实时仿真计算系统&#xff0c;并展出多项工业数字…