linux下 Make 和 Makefile构建你的项目

Make 和 Makefile构建你的项目

介绍


在软件开发中,构建项目是一个必不可少的步骤。make 是一个强大的自动化构建工具,而 Makefilemake 工具使用的配置文件,用于描述项目的构建规则和依赖关系。本篇博客将介绍 makeMakefile 的基本概念以及如何使用它们来管理项目的构建过程。

1. 什么是 Make?

make 是一个命令行工具,用于根据 Makefile 文件中的规则来自动化构建项目。它通过检查文件的时间戳来确定文件之间的依赖关系,并只构建已经过期或被修改的文件,从而提高构建效率。

2. 什么是 Makefile?

Makefile 是一个文本文件,其中包含了一系列规则,用于描述项目中文件之间的依赖关系以及如何构建目标文件。每个规则由一个目标(target)、依赖项(dependencies)和构建命令(recipe)组成。

如何编写 Makefile?

一个简单的 Makefile 包含了一系列的规则。以下是一个简单的示例:

# 定义目标和依赖关系
target: dependency1 dependency2command1command2# 定义另一个目标another_target: another_dependencyanother_command

Makefile 示例

这个 Makefile 中的规则描述了项目中各个文件之间的依赖关系和如何构建目标文件。通过运行 make 命令,make 将会根据这些规则自动构建出可执行文件 main。如果要清理生成的文件,可以运行 make clear 命令。
在这里插入图片描述
这个 Makefile 简单的示例,用于说明如何编写一个能够编译多个源文件并链接成一个可执行文件的 Makefile。让我们逐行解释它:

main: main.o input.o calcu.ogcc -o main main.o input.o calcu.o
  • 这里我们定义了一个名为 main 的目标,它依赖于三个文件:main.oinput.ocalcu.o。如果其中任何一个依赖项的时间戳比 main 的时间戳更新,make 就会重新构建 main
main.o: main.cgcc -c main.c
  • 这一行定义了一个规则,告诉 make 如何生成 main.o。它表明 main.o 依赖于 main.c,如果 main.c 更新了,make 就会用 gcc -c 编译器选项来编译 main.c 生成 main.o
input.o:input.cgcc -c input.c
  • 这个规则告诉 make 如何生成 input.o。如果 input.c 更新了,make 就会用 gcc -c 编译器选项来编译 input.c 生成 input.o
calcu.o: calcu.cgcc -c calcu.c
  • 这个规则告诉 make 如何生成 calcu.o。如果 calcu.c 更新了,make 就会用 gcc -c 编译器选项来编译 calcu.c 生成 calcu.o
clear:rm *.orm main
  • 最后,我们定义了一个名为 clear 的目标,它没有依赖项。这个目标的作用是清理生成的文件,使用 rm 命令删除所有的 .o 目标文件和可执行文件 main

如何使用 make ?

1.在项目根目录下编写 Makefile 文件(方法如上)定义目标、依赖关系和构建命令。
在这里插入图片描述

2.在终端中运行 make 命令,make 会自动查找当前目录下的 Makefile 文件并执行其中的规则。
在这里插入图片描述

3.若要构建特定的目标,可以在命令行中指定目标名称,例如 make target_name
在这里插入图片描述

4.可以使用 make clean 命令清理生成的文件。
在这里插入图片描述

结语

通过本篇博客的介绍,你已经了解了 makeMakefile 的基本概念以及如何使用它们来管理项目的构建过程。makeMakefile 提供了一种简单而有效的方式来自动化项目的构建,提高了开发效率,并确保了项目的正确构建和更新。

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

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

相关文章

【成品论文】2024美赛B题完整成品论文23页+3小问matlab代码+数据集汇总

2024 年美国大学生数学建模竞赛(2024 美赛)B 题: 2024 MCM 问题 B: 搜寻潜水艇 题目翻译: Maritime Cruises Mini-Submarines (MCMS)是一家总部位于希腊的公司,专门制造能够携 带人类到达海洋最深处的潜水艇。潜水艇是…

【Kubernetes】在k8s1.24及以上版本基于containerd容器运行时测试pod从harbor拉取镜像

基于containerd容器运行时测试pod从harbor拉取镜像 1、安装高版本containerd2、安装docker3、登录harbor上传镜像4、从harbor拉取镜像 1、安装高版本containerd 集群中各个节点都要操作 yum remove containerd.io -y yum install containerd.io-1.6.22* -y cd /etc/containe…

SpringBoot实战第三天

今天主要完成了: 新增棋子分类 棋子分类列表 获取棋子分类详情 更新棋子分类 更新棋子分类和添加棋子分类_分组校验 新增棋子 新增棋子参数校验 棋子分类列表查询(条件分页) 先给出分类实体类 Data public class Category {private Integer id;//主键IDNot…

[UI5 常用控件] 06.Splitter,ResponsiveSplitter

文章目录 前言1. Splitter1.1 属性 2. ResponsiveSplitter 前言 本章节记录常用控件Splitter,ResponsiveSplitter。主要功能是分割画面布局。 其路径分别是: sap.ui.layout.Splittersap.ui.layout.ResponsiveSplitter 1. Splitter 1.1 属性 orientation &#x…

DevOps落地笔记-17|度量指标:寻找真正的好指标?

前面几个课时端到端地介绍了软件开发全生命周期中涉及的最佳实践,经过上面几个步骤,企业在进行 DevOps 转型时技术方面的问题解决了,这个时候我们还缺些什么呢?事实上很多团队和组织在实施 DevOps 时都专注于技术,而忽…

【Linux网络编程三】Udp套接字编程(简易版服务器)

【Linux网络编程三】Udp套接字编程(简易版服务器) 一.创建套接字二.绑定网络信息1.构建通信类型2.填充网络信息①网络字节序的port②string类型的ip地址 3.最终绑定 三.读收消息1.服务器端接收消息recvfrom2.服务器端发送消息sendto3.客户端端发送消息sendto4.客户端…

TCP 了解

参考:4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding TCP报文 其中比较重要的字段有:(1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发…

利用IP地址精准定位服务

在数字化时代,IP地址已成为连接我们与网络世界的纽带之一。通过IP地址,我们可以追踪用户的位置信息,实现精准定位服务。本文将探讨如何利用IP地址精准定位服务,为个人和企业带来便利和价值。 一、什么是IP地址精准定位服务&#…

【FPGA】高云FPGA之IP核的使用->PLL锁相环

FPGA开发流程 1、设计定义2、设计输入3、分析和综合4、功能仿真5、布局布线6、时序仿真7、IO分配以及配置文件(bit流文件)的生成8、配置(烧录)FPGA9、在线调试 1、设计定义 使用高云内置IP核实现多路不同时钟输出 输入时钟50M由晶…

IDEA创建SpringBoot+Mybatis-Plus项目

IDEA创建SpringBootMybatis-Plus项目 一、配置Maven apache-maven-3.6.3的下载与安装(详细教程) 二、创建SpringBoot项目 在菜单栏选择File->new->project->Spring Initializr,然后修改Server URL为start.aliyun.com&#xff0c…

【图像文本化】Base64编解码OpenCV4中 Mat 对象

学习《OpenCV应用开发:入门、进阶与工程化实践》一书 做真正的OpenCV开发者,从入门到入职,一步到位! 前言 很多时候在开发中,需要保存图像为文本形式,以便于存储与传输。最常见的就是把图像文件编码为Ba…

C# CAD交互界面-自定义工具栏(二)

运行环境 vs2022 c# cad2016 调试成功 一、引用 acdbmgd.dllacmgd.dllaccoremgd.dllAutodesk.AutoCAD.Interop.Common.dllAutodesk.AutoCAD.Interop.dll using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.T…

spring boot学习第十篇:elastic search必须使用用户名密码授权后才能访问、在java代码中操作索引

前提条件:安装好了elastic search服务,参考:elastic search入门_ubuntu elasticsearch 密码-CSDN博客 1、配置elastic search必须使用用户名密码授权才能访问 1.1开启x-pack验证 修改config目录下面的elasticsearch.yml文件,添…

VM 虚拟机和容器技术之间有什么区别?

随着云计算技术的不断发展,虚拟机和容器技术作为两种常见的虚拟化技术,被广泛应用于云计算领域。虽然虚拟机和容器技术都是虚拟化技术,但它们之间存在一些重要的区别。本文将详细介绍虚拟机和容器技术的区别,以便读者更好地了解这…

亚信安慧AntDB推动技术创新与满足用户需求

随着互联网技术的迅猛发展,大数据时代的到来,数据库的需求不断增长。在这样的背景下,国产分布式数据库正逐渐崭露头角,AntDB作为其中的重要代表,也积极参与到了这场竞争中。作为国内的技术创新者,AntDB不仅…

【Mybatis】从0学习Mybatis(2)

前言 本篇文章是从0学习Mybatis的第一篇文章,由于篇幅太长CSDN会限流,因此我打算分开两期来写,这是第二期!第一期在这儿:【Mybatis】从0学习Mybatis(1)-CSDN博客 1.什么是ResultMap结果映射&am…

从小白到入门webrtc音视频通话

0. 写在前面 先会骑车,再研究为什么这么骑,才是我认为学习技术的思路,底部付了demo例子,根据例子上面的介绍即可运行。 1. 音视频通话要用到的技术简介 websocket 介绍:1. 服务器可以向浏览器推送信息;2…

C#,河豚算法(Blowfish Algorithm)的加密、解密源代码

Bruce Schneier 1 河豚算法(Blowfish Algorithm) 河豚算法(Blowfish Algorithm)是1993年11月由Bruce Schneier设计的一个完全开源的算法。 Blowfish算法是一个分组长度为64位、密钥长度可变的对称分组密码算法。 Blowfish算法具…

学习Android的第五天

目录 Android ConstraintLayout 约束布局 简介 ConstraintLayout 约束布局分类 1、相对定位 (Relative positioning) 2、边距 ( Margins ) 3、居中定位和偏向 ( Centering positioning and bias ) 4、环形定位 ( Circular positioning ) 5、对可见性的处理 ( Visibilit…

万物皆可播时代,我们如何把握机遇

在万物皆可播的时代,我们可以通过以下方式来把握机遇: 了解市场需求:通过观察和了解消费者的需求和偏好,发现具有潜力的市场空白。关注时尚、美妆、美食、旅游等领域的发展趋势,掌握最新的流行趋势,结合自…