【Linux】使用Makefile自动化编译项目:简化开发流程、提高效率
文章目录
- 示例一:编译一个进度条程序
- 示例二:编译一个简单的程序
- gcc的几个选项
- 结论
当你开始一个新的软件项目时,编写一个好的Makefile是非常重要的。Makefile是一个文本文件,用于指定如何构建和编译项目。它定义了目标文件、依赖关系以及编译命令等。在本文中,我们将通过两个示例Makefile来说明如何编写一个简单但功能强大的Makefile。
示例一:编译一个进度条程序
让我们首先看一下如何编写一个用于编译进度条程序的Makefile。假设我们有两个源文件main.c和processbar.c,以及对应的头文件。以下是示例的Makefile:
# 用于编译进度条程序的Makefile示例# 定义目标文件和它的依赖关系,并设置链接规则
processbar: main.o processbar.ogcc -o $@ $^# 编译main.c为main.o的规则
main.o: main.cgcc -c main.c# 编译processbar.c为processbar.o的规则
processbar.o: processbar.cgcc -c processbar.c# 定义伪目标clean,并设置删除目标文件和可执行文件的规则
.PHONY: clean
clean:rm -f main.o processbar.o processbar
在这个示例中,我们使用了一些常见的Makefile规则。首先,我们定义了目标文件processbar和它的依赖关系main.o和processbar.o。通过gcc -o $@ $^命令,我们将这些目标文件链接成可执行文件processbar。
接下来,我们定义了两个规则来编译源文件。main.o的规则使用gcc -c main.c命令将main.c编译成目标文件。同样地,processbar.o的规则使用gcc -c processbar.c命令将processbar.c编译成目标文件。
最后,我们定义了一个伪目标clean,它用于清除生成的目标文件和可执行文件。通过rm -f main.o processbar.o processbar命令,我们可以删除这些文件。
示例二:编译一个简单的程序
现在我们来看另一个示例,展示如何编写一个用于编译简单程序的Makefile。假设我们有一个源文件mytest.c,以下是对应的Makefile示例:
# 用于编译简单程序的Makefile示例# 定义目标文件和它的依赖关系,并设置链接规则
mybin: mytest.ogcc -o mybin mytest.o# 编译mytest.s为mytest.o的规则
mytest.o: mytest.sgcc -c -o mytest.o mytest.s# 汇编mytest.i为mytest.s的规则
mytest.s: mytest.igcc -S -o mytest.s mytest.i# 预处理mytest.c为mytest.i的规则
mytest.i: mytest.cgcc -E -o mytest.i mytest.c# 定义伪目标clean,并设置删除生成文件的规则
.PHONY: clean
clean:rm -f mytest.s mytest.i mytest.o mybin
在这个示例中,我们同样使用了一些常见的Makefile规则。我们定义了目标文件mybin和它的依赖关系mytest.o。通过gcc -o mybin mytest.o命令,我们将mytest.o链接成可执行文件mybin。
接下来,我们定义了三个规则来编译不同的源文件。mytest.o的规则使用gcc -c -o mytest.o mytest.s命令将汇编文件mytest.s编译成目标文件。mytest.s的规则使用gcc -S -o mytest.s mytest.i命令将预处理文件mytest.i汇编成汇编文件。mytest.i的规则使用gcc -E -o mytest.i mytest.c命令将源文件mytest.c预处理成预处理文件。
最后,我们同样定义了一个伪目标clean来清除生成的文件。
gcc的几个选项
gcc是一个C语言编译器,在Makefile中经常被用来编译源文件。下面是gcc编译器常用的几个选项及其含义:
-c:只编译源文件,生成目标文件,不进行链接。-o:指定输出文件的名称。-S:只进行编译和汇编,生成汇编代码文件,不进行链接。-E:只进行预处理,把预处理后的代码输出到标准输出,不进行编译、汇编和链接。-Wall:启用所有警告信息。-Werror:将所有警告当作错误来处理。-g:为调试生成额外的符号信息。
这些选项可以在Makefile中被用来编译和构建项目,例如:
# 编译main.c为main.o的规则
main.o: main.cgcc -c -o main.o main.c# 汇编mytest.i为mytest.s的规则
mytest.s: mytest.igcc -S -o mytest.s mytest.i
在上述示例中,-c选项表示只编译源文件,而不进行链接;-o选项指定输出文件名为main.o或mytest.s;-S选项表示只进行编译和汇编,生成汇编代码文件;-E选项表示只进行预处理;-g选项表示为调试生成额外的符号信息。-Wall和-Werror选项用于启用所有警告信息并将其视为错误,可以帮助我们更好地发现代码中的潜在问题和错误。
结论
通过这两个示例Makefile,我们展示了如何编写一个简单但功能强大的Makefile来编译程序。Makefile使得构建和编译项目变得更加自动化和简化,提高了开发效率。通过定义目标文件、依赖关系以及编译命令等规则,我们可以轻松地构建和维护复杂的项目。希望这篇博客对你编写Makefile有所帮助!
相关文章:
【Linux】使用Makefile自动化编译项目:简化开发流程、提高效率
文章目录 示例一:编译一个进度条程序示例二:编译一个简单的程序gcc的几个选项结论 当你开始一个新的软件项目时,编写一个好的Makefile是非常重要的。Makefile是一个文本文件,用于指定如何构建和编译项目。它定义了目标文件、依赖关…...
浅谈开源和闭源的认知
目录 在大型模型的发展中,开源和闭源两种截然不同的开发模式扮演着关键的角色。开源模式通过促进技术共享,吸引了大量优秀人才的加入,从而推动了大模型领域的不断创新。与此相反,闭源模式则着重于保护商业利益和技术优势ÿ…...
你了解Postman 变量吗?
变量是在Postman工具中使用的一种特殊功能,用于存储和管理动态数据。它们可以用于在请求的不同部分、环境或集合之间共享和重复使用值。 Postman变量有以下几种类型: 1、环境变量(Environment Variables): 环境变量是在Postman…...
ArmSoM-RK3588编解码之mpp编码demo解析:mpi_enc_test
一. 简介 [RK3588从入门到精通] 专栏总目录mpi_enc_test 是rockchip官方编码 demo本篇文章进行mpi_enc_test 的代码解析,编码流程解析 二. 环境介绍 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:ArmSoM-W3 Debian11 三. …...
【ES6.0】-详细模块化、export与Import详解
【ES6.0】-详细模块化、export与Import详解 文章目录 【ES6.0】-详细模块化、export与Import详解一、模块化概述二、ES6模块化的语法规范三、export导出模块3.1 单变量导出3.2 导出多个变量3.3 导出函数3.4 导出对象第一种第二种: 3.5 类的导出第一种第二种 四、imp…...
网工内推 | Base北京,国企网工运维,最高30k*14薪,IE认证优先
01 万方数据股份有限公司 招聘岗位:网络工程师 职责描述: 1.负责完成基础网络组网工作; 2.负责网络对象的访问控制及安全策略,配置VLan,黑白名单、地址转换、故障排查及网络安全监控工作; 3.负责对操作系…...
SQL LIKE 运算符:用法、示例和通配符解释
SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式。通常与LIKE运算符一起使用的有两个通配符: 百分号 % 代表零个、一个或多个字符。下划线 _ 代表一个单个字符。 以下是LIKE运算符的用法和示例: 示例 选择所有以字母 “a” 开头的客户&#x…...
编译原理Lab1-用FLEX构造C-Minus-f词法分析器
HNU编译原理lab1实验–根据cminux-f的词法补全lexical_analyer.l文件,完成词法分析器。 本文没有添加任何图片,但是以复制输出的形式展现出来了实验结果。 实验要求: 根据cminux-f的此法补全lexical_analyer.l文件,完成词法分析…...
网络安全之渗透测试入门准备
渗透测试入门所需知识 操作系统基础:Windows,Linux 网络基础:基础协议与简单原理 编程语言:PHP,python web安全基础 渗透测试入门 渗透测试学习: 1.工具环境准备:①VMware安装及使用;…...
【MySQL】宝塔面板结合内网穿透实现公网远程访问
文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cpo…...
通过AX6000路由器,实现外部访问内网的任意主机
概述 这里遇到一个场景,就是需要外部的人员,访问我内网的一台设备,进行内外部的设备联调。 这也是实际环境中,很常见的一种场景。 之前的做法是子设备上运行edge节点,可以直接访问。 但有的设备无法运行edge节点,那么可以参考一下这个方案来实现。 此方案可以摒弃了…...
如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??
如果我想让gpt从pdf文档中提取相关关键词的内容,可以怎么做呢??我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题,ChatGPT都能为您提供实用且高质量的建议和指导&am…...
camera-caps:Jetson设备上的一种实用的V4L2可视化界面
camera-caps:Jetson设备上的一种实用的V4L2可视化界面 github地址是: https://github.com/jetsonhacks/camera-caps 注意:Jetpack5.x需要选择tag 5.x版本...
CAN基础知识
CAN 简介 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种 各样的电子控制系统被开发了出来…...
vue3跨域怎么解决?
其实很简单 假设一个接口; http://101.42.170.68:10000/open/mockData/test1 首先,看自己项目中有没有vue.config.js文件,如果没有自己创建一个,如果有那吗在其中写。 vue.config.js: //固定格式,修改一部分就行了 const { def…...
强化学习小笔记 —— 如何选择合适的更新步长
在强化学习中,动作价值函数的更新可以使用增量法,如下所示: Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k − 1 r i ) 1 k ( r k ( k − 1 ) Q k − 1 ) 1 k ( r k k Q k − 1 − Q k − 1 ) Q k − 1 1 k [ r k − Q k − 1 ] \beg…...
容斥 C. Strange Function改编题
补题: 题目详情 - 9.段坤爱取模%%% - SUSTOJ 本题或许是参考 Problem - C - Codeforces 根据题意,f(i)就是不能被整除的最小的一个质因子。 打表发现,当15个质因子相乘后,长度就大于18。 因此可以知道小于等于1e16内的正整数x…...
C++笔记
文章目录 类模板类函数什么是友元函数?什么是内联函数?VECTOR哈希表栈队列映射与解除映射mmap()munmap可变参数 va_start()-va_send()vsnprintf()C/C++异常处理list红黑树类 基类、父类、顶层类、抽象类 子类、派生类 模板类 在C++中,模板类(Template Class)是一种通用…...
python-opencv 培训课程笔记(1)
python-opencv 培训课程笔记(1) 博主参加了一次opencv库的培训课程,把课程所学整理成笔记,供大家学习,第一次课程包括如下内容: 1.读取图像 2.保存图像 3.使用opencv库显示图像 4.读取图像为灰度图像 …...
【C++初阶】STL详解(七)Stack与Queue的模拟实现
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
