【Linux】使用Makefile自动化编译项目:简化开发流程、提高效率

文章目录

  • 示例一:编译一个进度条程序
  • 示例二:编译一个简单的程序
  • gcc的几个选项
  • 结论

当你开始一个新的软件项目时,编写一个好的Makefile是非常重要的。Makefile是一个文本文件,用于指定如何构建和编译项目。它定义了目标文件、依赖关系以及编译命令等。在本文中,我们将通过两个示例Makefile来说明如何编写一个简单但功能强大的Makefile。

示例一:编译一个进度条程序

让我们首先看一下如何编写一个用于编译进度条程序的Makefile。假设我们有两个源文件main.cprocessbar.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.oprocessbar.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.omytest.s-S选项表示只进行编译和汇编,生成汇编代码文件;-E选项表示只进行预处理;-g选项表示为调试生成额外的符号信息。-Wall-Werror选项用于启用所有警告信息并将其视为错误,可以帮助我们更好地发现代码中的潜在问题和错误。

结论

通过这两个示例Makefile,我们展示了如何编写一个简单但功能强大的Makefile来编译程序。Makefile使得构建和编译项目变得更加自动化和简化,提高了开发效率。通过定义目标文件、依赖关系以及编译命令等规则,我们可以轻松地构建和维护复杂的项目。希望这篇博客对你编写Makefile有所帮助!

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

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

相关文章

8年老鸟整理,自动化测试-准备测试数据详细...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 大部分类型的测试…

基于C#实现Bitmap算法

在所有具有性能优化的数据结构中,我想大家使用最多的就是 hash 表,是的,在具有定位查找上具有 O(1)的常量时间,多么的简洁优美,但是在特定的场合下: ①:对 10 亿个不重复的整数进行排序。 ②&am…

python获取透明图

import cv2 import os import numpy as nproot "./test" for file in os.listdir(root):# 读取图片image cv2.imread(os.path.join(root, file), cv2.IMREAD_UNCHANGED)new np.zeros((image.shape[0], image.shape[1], image.shape[2]), np.uint8)# 检查图片是否为…

AI原生应用为百度带来新增量

我是卢松松,点点上面的头像,欢迎关注我哦! AI将彻底改变每一个行业!得益于AI和基础模型的驱动,百度在AI原生应用领域厚积薄发。 11月21日,百度Q3财报发布,数据显示:三季度营收达344.47亿元&…

Redis篇---第九篇

系列文章目录 文章目录 系列文章目录前言一、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?二、什么情况下可能会导致 Redis 阻塞?三、缓存和数据库谁先更新呢?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

Axios简单使用与配置安装-Vue

安装Axios npm i axios main.js 导入 import Axios from axios Vue.prototype.$axios Axios简单发送请求 get getTest() {this.$axios({method: GET,url: https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/}).then(res > {//请求成功回调console.log(res)}…

uiautomator2快速入门app自动化测试教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、环境准备1.安装软件2.安装库 二、adb 连接手机1. 准备工作2. 第一种连接方式:USB连接3. 第二种连接方式:WLAN连接4. 第三种连接方式…

②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL日志 ②⑩ MySQL日志:错误日志…

SpringBoot3.x最简集成SpringDoc-OpenApi

为什么使用SpringDoc 在SpringBoot低版本时一般使用Swagger扫描接口生成Json格式的在线文档,然后通过swagger-ui将Json格式的文档以页面形式展示文档。可惜遗憾的是swagger更新到3.0.0版本(springfox)后不更新了。 SpringBoot3.x以后需要的JDK版本最低为Java17&…

MQ和redis的内部原理一些总结

首先,先知道内部原理;其次,就是查官方文档实战了。 但是如果不熟悉内部原理,那么仅仅只是安装官方文档,并不能排除跟踪问题和故障、预防风险等策略; 以下总结图解:(mysql 8.0新增的…

YOLO目标检测——卫星遥感舰船检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:卫星遥感舰船检测数据集说明:卫星遥感舰船检测数据集,真实场景的高质量图片数据,数据场景丰富,含船一个类别标签说明:使用lableimg标注软件标注,标注框质量高,含voc(xm…

Redis的持久化

redis是一个内存数据库,是把数据存储在内存中的,而我们知道内存中的数据是不持久的,一旦服务器重启或者进程重启,内存的数据就丢失了.为了让数据达到持久化的效果,就必须把数据写到硬盘上. redis相对于mysql这样的关系型数据库最明显的优势就是快.所以为了保证速度快,数据还得…

动态跳过测试用例

动态跳过测试用例 说明 我们可以通过指定环境变量来动态判断是否执行指定的测试用例设置环境变量有很多种方法,例如命令行方式,格式:--env keyval1,key2val2 ,若需要指定多个环境变量则需要逗号来隔开,而不是空格 t…

Live800:企业提升客户互动体验,有哪些关键因素?

如今,随着信息时代的不断发展,企业已经不再是单向的商业机构,他们需要与客户进行及时的沟通与反馈,从而更好地提升客户互动体验,达到营销和用户体验的双赢局面。那么,企业如何提升客户互动体验呢&#xff1…

设计模式——RBAC 模型详解

1.什么是 RBAC 呢? RBAC 即基于角色的权限访问控制(Role-Based Access Control)。这是一种通过角色关联权限,角色同时又关联用户的授权方式。 简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配…

Mysql 中如何导出数据?

文章目录 前言MySQL 导出数据使用 SELECT ... INTO OUTFILE 语句导出数据SELECT ... INTO OUTFILE 语句有以下属性:导出表作为原始数据导出SQL格式的数据将数据表及数据库拷贝至其他主机 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:…

Linux程序之可变参数选项那些事!

一、linux应用程序如何接收参数? 1. argc、argv Linux应用程序执行时,我们往往通过命令行带入参数给程序,比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的? 通常应用程序都…

Raspberry Pi 5 新一代单板计算机:树莓派5代 (介绍、入门、解疑)

树莓派5代正式发布后,硬件和性能的全面升级让众多开发者们都想入手感受一波,外观上Raspberry Pi 5 与前代产品非常相似,不过,在保留信用卡大小的整体尺寸的同时,也更新了一些设计元素,以适应新芯片组的功能…

python实现调和反距离空间插值法AIDW

1 简介 AIDW 主要是针对 IDW 的缺点进行了改进,考虑了样本点与预测点的位置,即方向和距离,具体见下图: 2 改进 IDW 公式: 从IDW算法可看出,插值点的估算值仅与插值样本距插值点的远近相关,并未…