探索Linux项目自动化构建:make/Makefile的使用方法

news2024/9/21 0:33:12

🌱博客主页:青竹雾色间
🌱系列专栏:Linux
😘博客制作不易欢迎各位👍点赞 +⭐收藏 +➕关注
在这里插入图片描述
标题: 使用 Makefile 实现项目自动化构建 - 从零开始学习 Makefile

摘要: Makefile 是一个用于自动化构建项目的强大工具。本文将介绍如何使用 Makefile 管理和构建项目,通过一个简单的示例演示 Makefile 的基本用法。


导言

在软件开发中,构建工具是必不可少的。它们大大简化了软件构建的过程,提高了开发效率。Makefile 是其中一个最流行的工具之一。Makefile 可以根据文件之间的依赖关系自动化执行编译任务。本文将介绍如何使用 Makefile 管理和构建项目,通过一个简单的示例演示 Makefile 的基本用法。


什么是 Makefile?

Makefile 是一种包含了一系列规则的文本文件,用于指导构建系统(比如 Make)如何编译和链接源文件。通过 Makefile,我们可以定义哪些文件需要编译,以及它们之间的依赖关系。Makefile 使得整个项目的构建过程自动化,提高了软件开发的效率。


示例

让我们通过一个简单的示例来理解 Makefile 的基本概念。假设我们有一个简单的 C 语言项目,包含一个源文件 hello.c。我们将使用 Makefile 来管理和构建这个项目。

hello.c 文件内容:

#include <stdio.h>

int main() {
    printf("hello Makefile!\n");
    return 0;
}

Makefile 内容:

# 目标文件
TARGET = hello

# 源文件
SRC = hello.c
# 中间文件
INTERMEDIATE = hello.i hello.s hello.o

# 默认目标
all: $(TARGET)

# 生成可执行文件
$(TARGET): $(INTERMEDIATE)
	gcc $(INTERMEDIATE) -o $(TARGET)

# 生成预处理文件
hello.i: $(SRC)
	gcc -E $^ -o $@

# 生成汇编文件
hello.s: hello.i
	gcc -S $^ -o $@

# 生成目标文件
hello.o: hello.s
	gcc -c $^ -o $@

# 项目清理
.PHONY: clean
clean:
	rm -f $(INTERMEDIATE) $(TARGET)

在这个 Makefile 中,我们定义了以下几个规则:

  1. all:默认目标,依赖于 $(TARGET),即 hello 可执行文件。
  2. $ (TARGET):生成可执行文件的规则,依赖于 $(INTERMEDIATE) 中间文件。
  3. $(INTERMEDIATE):中间文件,包括 hello.ihello.shello.o
  4. hello.i:生成预处理文件的规则,依赖于 $(SRC) 源文件。
  5. hello.s:生成汇编文件的规则,依赖于 hello.i
  6. hello.o:生成目标文件的规则,依赖于 hello.s
  7. clean:清理项目的规则,用于删除中间文件和可执行文件。

运行示例

我们可以通过以下命令在命令行中运行 Makefile:

  1. 编译项目:

    make
    
  2. 清理项目:

    make clean
    

总结

通过这个简单的示例,我们学习了如何使用 Makefile 管理和构建项目。Makefile 可以根据文件之间的依赖关系自动执行编译任务,从而提高了软件开发的效率。现在,你可以尝试在自己的项目中使用 Makefile,享受自动化构建的便利。

在实际项目中,Makefile 可以更加复杂和强大。它可以根据项目的实际需求进行扩展和定制。随着对 Makefile 的熟悉,你可以通过 Makefile 更好地管理和构建你的项目。


延伸阅读

  1. GNU Make 官方文档
  2. Makefile 教程

这篇博客详细介绍了如何使用 Makefile 实现项目自动化构建,通过一个简单的示例演示了 Makefile 的基本用法。希望本文能够帮助读者更好地理解和使用 Makefile。


本篇文章到此为止,感谢收看,如有不足,多谢指正!
在这里插入图片描述

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

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

相关文章

如何在 OpenCloudOS 上安装 OpenTenBase 数据库

OpenTenBase 是由开放原子开源基金会孵化及运营的开源项目&#xff0c;是一款企业级的分布式 HTAP 数据库&#xff0c;具备高扩展性、商业数据库语法兼容、分布式 HTAP 引擎、多级容灾和多维度资源隔离等能力&#xff0c;目前已经成功应用于金融、医疗、航天等诸多行业的核心业…

Github Coplit和Poe不再订阅,改用Token和LobeChat

优化AI使用方式 1.取消Poe和Github Coplit的年度订阅 今天把200$ 的Poe和100$的Github Coplit的年度订阅取消了&#xff0c;确保到期不会续定&#xff0c;包年用AI的时代&#xff0c;在这里结束了。 2.改用Token购买模式 使用的AI质量必须不变&#xff0c;改用Token的方式&…

【Prometheus】Prometheus安装部署流程详解,配置参数webUI使用方法解析说明

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

二十、Java8新特性

文章目录 引入一、Lambda表达式1.1 快速入门1.2 Lambda语法 二、函数式(Functional)接口2.1 函数式(Functional)接口介绍2.2 Java内置函数式接口 三、方法引用与构造器引用3.1 方法引用3.2 构造器引用 四、强大的Stream API4.1 创建 Stream 的4种方式4.2 Stream 的中间操作4.2.…

PHP图书馆在指尖图书借阅小程序助力全民阅读系统小程序源码

​图书馆在指尖 —— 图书借阅小程序助力全民阅读 &#x1f4da;【开篇&#xff1a;指尖上的知识海洋】&#x1f4da; 在这个快节奏的时代&#xff0c;你是否曾渴望随时随地都能沉浸在书海中&#xff1f;现在&#xff0c;有了图书借阅小程序&#xff0c;图书馆就真正来到了你…

【MySQL08】【死锁】

文章目录 一、前言二、查看事务加锁情况1. 使用 information_schema 数据库中表获取锁信息1.1 INNODB_TRX1.2 INNODB_LOCKS1.3 INNODB_LOCK_WAITS 2. 使用 SHOW ENGIN INNODB STATUS 获取锁信息 三、死锁四、参考内容 一、前言 最近在读《MySQL 是怎样运行的》、《MySQL技术内…

GPU版pytorch安装(win/linux)

参考&#xff1a; Pytorch环境配置——cuda、、cudnn、torch、torchvision对应版本&#xff08;最全&#xff09;及安装方法-CSDN博客 Previous PyTorch Versions | PyTorch 法1&#xff1a;命令安装 如&#xff1a; conda install pytorch2.1.0 torchvision0.16.0 torchau…

Leetcode面试经典150题-63.不同路径II

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**本题是典型的动态规划&#xff0c;但是需要注意的是这个网格中是有障碍的&#xff0c;障碍不能走所以其实还是一样的&#xff0c;计算所有点到(m-1,n-1)有多少种方式&#xff0c;返回(0,0)位置的解就行了 */…

Python | Leetcode Python题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; class Solution:def validUtf8(self, data: List[int]) -> bool:MASK1, MASK2 1 << 7, (1 << 7) | (1 << 6)def getBytes(num: int) -> int:if (num & MASK1) 0:return 1n, mask 0, MASK1while num & m…

Python文件自动分类

假如这样的步骤全部手动做下来耗时是6秒&#xff0c;在文件数量不多的情况下&#xff0c;比如10个文件&#xff0c;总共耗时一分钟其实是能够接受的。 但当文件数量特别多时&#xff0c;或者这个操作特别频繁每天都要做十几二十次时&#xff0c;手动操作就会变得耗时又繁琐…

哪款宠物空气净化器能更好的清除浮毛?希喂、范罗士测评

七年前开始养了第一只小猫咪&#xff0c;没想到从此家里就开始一直养&#xff0c;到现在都已经养了5只。之前第一只的时候&#xff0c;就觉得很可爱&#xff0c;而且当时刚毕业&#xff0c;算是一时上头才养了它&#xff0c;后面发现我们经常是要出门上班、出差、游玩&#xff…

冲击大厂算法面试=>链表专题【链表反转之局部反转升级版】

目录标题 多重局部反转之K 个一组翻转链表上代码题解呀实在不会的时候记住 多重局部反转之K 个一组翻转链表 上代码 整个函数通过不断地检查剩余节点数量和进行局部反转&#xff0c;实现了链表的分组反转&#xff0c;最后返回反转后的链表。这种方法有效地利用了额外的 pre 和…

VBA学习(71):Excel VBA 访问带密码保护的Access数据库/用户窗体设置/EXCEL用户+密码登录界面(Access版)

前两天我们分享了一个用户密码登录EXCEL的案例【Excel VBA 用户窗体设置/一步一步代你设计EXCEL用户密码登录界面】&#xff0c;文中提及数据存储在Access中的情况&#xff0c;今天我就来把数据表&#xff08;tb用户&#xff09;移到Access中&#xff0c;修改一下代码&#xff…

使用jmeter压测数据库

写在文章开头 除了wrk以外,jmeter一直是笔者比较喜欢的一个压测工具,从使用场景和功能范围来看,算是一款比较全面且上手快速的压测工具,本文将基于MySQL数据库为读者演示一下如何通过jmeter压测数据库,希望对你有帮助。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的…

FreeRTOS学习笔记—②RTOS的认识(持续更新中)

由于正在学习韦东山大佬的RTOS课程&#xff0c;结合了网上的一些资料&#xff0c;整理记录了下自己的感悟&#xff0c;用于以后自己的回顾。如有不对的地方请各位大佬纠正。 课程链接&#xff1a;https://www.bilibili.com/video/BV1844y1g7ud/?spm_id_from333.337.search-car…

Postman环境变量:简化API测试的利器

引言 在当今快速发展的互联网时代&#xff0c;API&#xff08;应用程序接口&#xff09;的重要性不言而喻。无论是内部系统间的通信还是对外服务的提供&#xff0c;API都扮演着至关重要的角色。然而&#xff0c;在API的开发与测试过程中&#xff0c;经常需要处理各种各样的配置…

Java语言程序设计基础篇_编程练习题**17.21 (十六进制编辑器)

目录 题目&#xff1a;**17.21 (十六进制编辑器) 代码示例 结果展示 题目&#xff1a;**17.21 (十六进制编辑器) 编写一个 GUI 应用程序&#xff0c;让用户在文本域输入一个文件名&#xff0c;然后按回车键&#xff0c;在文本域显示它的十六进制表达形式。用户也可以修改十六…

SEO之网站结构优化(十四-内部链接及权重分配3)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 7、锚文字分布及变化 前面…

不可不知的WPF形状(Shape)

在WPF开发中经常需要进行绘制图形&#xff0c;可以利用Shape类型绘制基本的形状&#xff0c;而且Shape派生自FrameworkElement&#xff0c;属于UI元素范畴&#xff0c;可以直接利用XAML进行绘制。本文通过一些简单的小例子&#xff0c;简述如何通过Shape类绘制形状&#xff0c;…

SMB攻击利用之-设置远程mimikatz程序为定时任务流量数据包分析

SMB协议作为windows环境下最为常见的一种协议&#xff0c;在历史上出现过无数的通过SMB协议进行网络攻击利用的案例&#xff0c;包括针对SMB协议本身以及通过SMB协议实施网络攻击。 本文将介绍一种SMB协议的常见利用方式&#xff0c;即通过windows的服务调用将远程主机上的mim…