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

makefile简易教程

makefile简易教程

在这里插入图片描述

一、学习目标

达到多文件快速编译的需求,相关符号的意思,以及其它注意事项。

二、快速入门

2.1 基本概念

Makefile 是一个在Unix和Linux操作系统上使用的构建工具,用于自动化编译和构建源代码。
在这里插入图片描述

2.2 用处

通过Makefile,你可以定义一系列规则来指示如何构建源代码,以及定义每个规则所需要的依赖关系。Makefile也可以在构建过程中执行自定义命令,例如清理旧的构建输出、运行测试等。

2.3 基本语法

目标文件:依赖文件指令
target: dependenciescommand

其中,target 表示构建目标(例如可执行文件、库文件、对象文件等),dependencies 表示构建目标所依赖的文件(可以是其他目标或源代码文件),command 表示构建目标的命令。注意,command 前面必须有一个tab(制表符)。

例如:

test:test.cgcc -o test test.c

2.4 变量

Makefile还支持变量,用于在不同规则之间共享常量或者路径等信息。变量的定义格式如下:

VARIABLE_NAME = variable_value

示例:

CC = gcc
CFLAGS = -Wall -Werrorhello: hello.c$(CC) $(CFLAGS) -o hello hello.c

在这个示例中,CC 变量定义了编译器的名称,CFLAGS 变量定义了编译器的参数。在构建hello目标时,Makefile使用这些变量来执行编译命令。

2.5 构建多个目标

在这里插入图片描述

当有多个.c文件需要进行编译时,可以这样构建makefile

all: hello worldhello: hello.c$(CC) $(CFLAGS) -o hello hello.cworld: world.c$(CC) $(CFLAGS) -o world world.c

在这个示例中,all 是一个伪目标,它依赖于helloworld。当我们运行make all时,Make会自动构建helloworld目标。

注意,all是一个伪目标,它并不会生成任何文件。在Makefile中,有一些特殊的目标(例如allclean等)通常被定义为伪目标。

2.6 清理目标

Makefile还可以定义清理目标,用于删除构建过程中生成的临时文件。例如:

clean:rm -f hello world *.o

在这个示例中,clean 是一个伪目标,它的命令会删除当前目录下的helloworld和所有.o文件。

2.7 .PHONY

在这里插入图片描述

在Makefile中,.PHONY是一个特殊的目标,用于声明一些伪目标(phony target),也就是那些不对应任何实际的文件或目录,只是用来执行一些特定的操作的目标。

声明伪目标的方式很简单,只需要在Makefile中添加以下语句:

.PHONY: target1 target2 ...

其中,target1target2等为伪目标的名称,可以声明多个伪目标,它们之间用空格分隔。

使用.PHONY声明伪目标的好处在于,它可以避免出现一些潜在的问题,例如:

  1. 当伪目标与实际文件或目录同名时,Makefile可能会将其误认为是一个文件或目录,从而导致错误的行为。使用.PHONY可以显式地声明这些目标是伪目标,避免这种情况发生。
  2. 如果在命令行中执行make target时,target已经存在,并且其时间戳比依赖文件的时间戳更晚,Makefile默认情况下不会重新构建target。但是如果target是一个伪目标,那么即使时间戳较晚,Makefile也会执行伪目标下的命令,因为伪目标并不对应任何实际的文件或目录。

例如,我们可以在Makefile中声明一个名为clean的伪目标,用于清理项目中生成的临时文件和目录,如下所示:

.PHONY: cleanclean:rm -rf build/* bin/*

在命令行中执行make clean时,Makefile会执行rm -rf build/* bin/*命令,清理build目录和bin目录中的所有文件。

需要注意的是,.PHONY目标本身并不会执行任何操作,它只是用来声明伪目标。因此,在Makefile中,.PHONY目标通常放在文件的最前面或最后面,以方便查看和维护。

2.8 $符号

在Makefile中,@和@和@^等符号是自动化变量,它们代表了不同的含义:

  • $@ 表示当前规则中的目标文件,即被生成的文件名。
  • $^ 表示当前规则中所有的依赖文件,以空格分隔。

例如:

makefileCopy code
app: main.o utils.ogcc $^ -o $@main.o: main.cgcc -c $< -o $@utils.o: utils.cgcc -c $< -o $@

在上面的示例中,我们定义了一个目标文件app,它依赖于两个对象文件main.o和utils.o。在生成目标文件时,我们使用将所有依赖文件都链接在一起,使用^将所有依赖文件都链接在一起,使用所有依赖文件都链接在一起,使用@作为生成的目标文件名。同时,我们还定义了两个规则分别用于生成main.o和utils.o文件,在这里我们使用$<代表当前规则中的第一个依赖文件,即源代码文件名。

2.9 makefile与其它语言冲突

例如我在使用C语言连接MySQL数据库时,使用到的编译选项中含有$()的字样,然而makefile中,这类字样指代某个变量,所以产生冲突,导致无法make成功。

可以将编译选项改为$$(),双美元符号可以提示makefile需要显式调用的。

上述例子如下:

.PHONY:all
all:test_cgi mysql_conntest_cgi:test_cgi.ccg++ -o $@ $^mysql_conn:mysql_conn.ccg++ -o $@ $^ -std=c++11 $$(mysql_config --cflags --libs).PHONY:clean
clean:rm -f test_cgi mysql_conn

在这里插入图片描述

相关文章:

makefile简易教程

makefile简易教程 一、学习目标 达到多文件快速编译的需求&#xff0c;相关符号的意思&#xff0c;以及其它注意事项。 二、快速入门 2.1 基本概念 Makefile 是一个在Unix和Linux操作系统上使用的构建工具&#xff0c;用于自动化编译和构建源代码。 2.2 用处 通过Makefi…...

快速入门nginx

目录 1.nginx前言 2.什么是nginx 3.Nginx作用&#xff1f; 1.正向代理 2.反向代理 3.轮询 4.加权轮询 4.Nginx的安装 1.windows下安装 2.linux下安装 5.Nginx常用命令 1.nginx前言 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#…...

甘特图:项目管理工具,轻松简化工作流程

项目规模越大&#xff0c;管理就越复杂&#xff0c;有时候甚至一个项目经理需要管理多个项目&#xff0c;当多个项目、多条任务同时进行&#xff0c;项目所涉及的范围广&#xff0c;内容越来越复杂&#xff0c;使得项目越难以把控&#xff0c;好的管理工具&#xff0c;可以提升…...

刷题专练之翻转题练习

文章目录一、 编写函数实现字符串翻转二、轮转数组总结一、 编写函数实现字符串翻转 描述 编写一个函数&#xff0c;实现字符串的翻转 输入描述&#xff1a; 输入一个字符串 输出描述&#xff1a; 输出翻转后的字符串 写法一&#xff1a; 这种方法是定义begin和end&#xff0…...

【Java】死锁

一、什么是死锁 死锁指多个线程在执行过程中&#xff0c;因争夺资源造成的一种相互等待的僵局。 进程死锁是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。…...

DS图—图的最短路径(无框架)迪杰斯特拉算法

目录 题目描述 AC代码 题目描述 给出一个图的邻接矩阵&#xff0c;输入顶点v&#xff0c;用迪杰斯特拉算法求顶点v到其它顶点的最短路径。 输入 第一行输入t&#xff0c;表示有t个测试实例 第二行输入顶点数n和n个顶点信息 第三行起&#xff0c;每行输入邻接矩阵的一行&…...

【笔记】数据异常检测与修复总结

文章目录一、异常种类1. 对于移动对象的数据异常2. 对于时序数据的异常检测二、异常数据清洗流程三、数据预处理四、异常检测算法五、异常修复算法六、漂移数据清洗一、异常种类 不同的研究对象&#xff0c;有着不同的异常分类方式 1. 对于移动对象的数据异常 异常数据信息&…...

算法笔记(七)—— 图的相关知识及算法

图的存储方式 1. 邻接表&#xff08;记录关于某点的直接相邻点&#xff09; 2. 邻接矩阵&#xff08;一定是正方形的矩阵&#xff0c;对点进行编号&#xff0c;点到点的权值由距震中的值表示&#xff0c;无直接相连记为正无穷&#xff09; 图的模板 unordered_map<int,No…...

ssh配置互信时错误解决方法

之前项目中遇到有关配置ssh互信免密登录问题&#xff0c;为避免以后踩坑&#xff0c;现记录一下避坑指南。 1、提示如下错误&#xff1a; Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 问题分析&#xff1a;可能是ssh配置问题。 查看日志/var/log/secure&…...

SQL69 返回产品并且按照价格排序

描述有Products 表prod_idprod_nameprod_pricea0011egg3a0019sockets4b0019coffee15【问题】编写 SQL 语句&#xff0c;返回 Products 表中所有价格在 3 美元到 6 美元之间的产品的名称&#xff08;prod_name&#xff09;和价格&#xff08;prod_price&#xff09;&#xff0c;…...

vue+elementUI 实现设置还款日字母弹窗组件

1、业务背景 还款业务&#xff0c;设置每月还款日&#xff0c;选每月几号扣款&#xff0c;不需要29、30、31&#xff0c;因为不是每个月都有这三天的 2、预期效果图 3、代码实现 3.1 初始化vue项目 地址&#xff1a;https://cn.vuejs.org/guide/introduction.html 3.2 在项…...

【JavaGuide面试总结】Redis篇·中

【JavaGuide面试总结】Redis篇中1.Redis 单线程模型了解吗&#xff1f;2.Redis6.0 之后为何引入了多线程&#xff1f;3.Redis 是如何判断数据是否过期的呢&#xff1f;4.过期的数据的删除策略了解么&#xff1f;5.Redis 内存淘汰机制了解么&#xff1f;6.什么是 RDB 持久化&…...

Python:每日一题之全球变暖(BFS连通性判断)

题目描述 你有一张某海域 NxN 像素的照片&#xff0c;"."表示海洋、"#"表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿…...

VUE -- defineExpose

defineExpose定义demo定义 defineExpose定义&#xff1a;用于组件通信中父级组件调用操作子组建方法和响应式属性参数能力 在使用definExpose前需要了解两个拷贝对象函数 对象copy&#xff1a;shallowReactive 与 数据 copy&#xff1a;shallowRef 这两个都是vue包里面的 简…...

实用调试技巧【下篇】

&#x1f534;本文章是在 Visual Studio 2022&#xff08;VS2022&#xff09;编译环境下进行操作讲解 文章目录3.2.调试的时候查看程序当前信息3.2.1.查看临时变量的值3.2.2.查看内存信息3.2.3.查看调用堆栈3.2.4.查看汇编信息&#x1f973;4.调试实例&#x1f973;5.如何写出&…...

【数据结构期末例题】

前言 本文是博主自己在准备学校数据结构考试时的总结&#xff0c;各个知识点都贴有对应的详细讲解文章以供大家参考&#xff1b;当然文中还有许许多多的截图&#xff0c;这些是博主对主要内容的摘取&#xff0c;对于那些基础较好的同学可以直接看截图&#xff0c;减少跳转对应文…...

管理物理和快照备数据库(Physical and Snapshot Standby Databases)

1&#xff0e;打开物理备数据库 物理备数据库可以打开做只读访问&#xff0c;用于从主数据库卸载查询负载。 如果已经购买Oracle Active Data Guard选项的授权&#xff0c;当数据库打开时Redo Apply可以是激活的&#xff0c;因此允许查询返回与从主数据库返回的完全相同的结果…...

双目立体视觉:SAD算法

算法原理SAD(Sum of absolute differences)是一种图像匹配算法。基本思想&#xff1a;差的绝对值之和。此算法常用于图像块匹配&#xff0c;将每个像素对应数值之差的绝对值求和&#xff0c;据此评估两个图像块的相似度。该算法快速、但并不精确&#xff0c;通常用于多级处理的…...

海外问卷调查答题技巧,纯干货分享,新手小白看过来

海外问卷调查为什么别人赚得盆满钵满而我却连通过都不行&#xff1f;是不是经常有人发出这种疑问&#xff0c;东哥作为一个结交过很多做问卷调查行业的跨境人士&#xff0c;也了解到很多做这一行的去答题的时候都是掌握一定技巧的&#xff0c;而不是去乱答。今天东哥就来说说国…...

【NGINX入门指北】Nginx Web 架构实验

Nginx Web 架构实验 文章目录Nginx Web 架构实验一、动态网站结构二、LNMP 动态网站环境部署三、fastcgi & php-fpm&#xff1a;四、php-fpm初始化配置五、Nginx Location、六、Nginx Rewrite七、CA&HTTPS八、Nginx 的平滑升级一、动态网站结构 资源 资源文件识别——…...

如何快速掌握KLayout:专业版图设计的终极实战指南

如何快速掌握KLayout&#xff1a;专业版图设计的终极实战指南 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout KLayout是一款功能强大的开源版图设计工具&#xff0c;专门用于集成电路&#xff08;IC&#xff09;和…...

长期跳健身操,颈椎会过度屈伸损伤吗

健身爱好者长期跳健身操、跟随节奏做颈部屈伸动作&#xff0c;是运动核心场景&#xff0c;却不知长期如此会让颈 “过度屈伸”&#xff0c;积累屈伸与爆发发力复合损伤。健身操中部分动作要求颈部快速屈伸、左右摆动&#xff0c;爆发性发力导致颈部肌肉与韧带承受瞬间张力&…...

Java开发者晋升指南:集成Phi-3-vision构建AI面试题库与评估系统

Java开发者晋升指南&#xff1a;集成Phi-3-vision构建AI面试题库与评估系统 1. 技术招聘的痛点与AI解决方案 技术面试官每天面临重复性劳动&#xff1a;根据JD设计题目、评估代码、写反馈。传统方式存在三大痛点&#xff1a; 题库更新慢&#xff1a;技术栈迭代快&#xff0c…...

ViGEmBus虚拟控制器驱动完全指南:从技术原理到场景落地的突破方案

ViGEmBus虚拟控制器驱动完全指南&#xff1a;从技术原理到场景落地的突破方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 价值定位&#xff1a;重新定义…...

老旧电脑焕新:OpenClaw+GLM-4.7-Flash在4GB内存设备上的优化运行方案

老旧电脑焕新&#xff1a;OpenClawGLM-4.7-Flash在4GB内存设备上的优化运行方案 1. 为什么要在老旧电脑上部署AI助手&#xff1f; 去年整理书房时&#xff0c;我翻出一台2015年的MacBook Air&#xff0c;4GB内存的配置在当下连浏览器开几个标签页都卡顿。正当准备将它送进回收…...

工业自动化必备:Kepware+UaExpert实现OPC UA通信的5个关键步骤与常见问题解决

工业自动化实战&#xff1a;Kepware与UaExpert的OPC UA通信全流程解析 在工业4.0时代&#xff0c;设备间的无缝通信已成为智能制造的基础能力。作为工业自动化领域的黄金标准&#xff0c;OPC UA协议凭借其跨平台、高安全性等特性&#xff0c;正在取代传统OPC DA成为工厂数据交互…...

RWKV7-1.5B-g1a参数避坑:top_p=0.9在中文任务中易引发事实性错误实测

RWKV7-1.5B-g1a参数避坑&#xff1a;top_p0.9在中文任务中易引发事实性错误实测 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合中文场景下的基础问答、文案续写和简短总结任务。作为一款轻量级模型&#xff0c;它能在单卡2…...

智能邮件管家:OpenClaw+GLM-4.7-Flash自动化邮件处理系统

智能邮件管家&#xff1a;OpenClawGLM-4.7-Flash自动化邮件处理系统 1. 为什么需要自动化邮件处理 作为每天需要处理上百封邮件的商务人士&#xff0c;我发现自己陷入了"邮件黑洞"——早上打开邮箱就像打开潘多拉魔盒&#xff0c;重要客户询盘、会议邀请、账单通知…...

毕业设计实战:基于SpringBoot+Vue+MySQL的校园一卡通管理系统设计与实现指南

毕业设计实战&#xff1a;基于SpringBootVueMySQL的校园一卡通管理系统设计与实现指南 在开发“基于SpringBootVueMySQL的校园一卡通管理系统”毕业设计时&#xff0c;曾因器材借用表未通过学生ID与器材ID双外键关联踩过关键坑——初期仅单独设计借用表的编号字段&#xff0c;…...

3步实现路由器固件自动更新:从繁琐到智能的运维升级指南

3步实现路由器固件自动更新&#xff1a;从繁琐到智能的运维升级指南 【免费下载链接】immortalwrt An opensource OpenWrt variant for mainland China users. 项目地址: https://gitcode.com/GitHub_Trending/im/immortalwrt 一、痛点分析&#xff1a;为什么手动更新让…...