Linux----Makefile基础

Makefile 是自动化构建工具 make 的配置文件,用于定义编译规则和依赖关系,实现高效增量编译。

初识makefile


1. 什么是 make
  • 定义
    make 是一个命令行工具(可执行程序),用于解析并执行 Makefile 中定义的编译规则,实现自动化构建。
  • 路径
    通常安装在 /usr/bin/make(Linux/Unix 系统)。
  • 功能
    根据 Makefile 中的规则,判断哪些文件需要重新编译,并执行相应的命令。

2. 什么是 Makefile
  • 定义
    一个文本文件,由开发者编写,用于描述程序的编译规则依赖关系构建步骤
  • 作用
    • 指导 make 命令如何编译和链接程序。
    • 记录源文件、目标文件、可执行文件之间的依赖关系。
  • 默认查找规则
    执行 make 命令时,默认在当前目录按顺序查找 GNUmakefile → makefile → Makefile

3. 使用 Makefile 的优势
优势说明
简化编译命令只需输入 make 即可自动完成复杂编译步骤,无需手动输入长命令。
提高编译效率仅重新编译修改过的文件及其依赖项,大幅减少重复编译时间。
维护代码关系清晰管理多文件项目的依赖关系(如 .c.h.o 文件间的关联)。
跨平台支持规则文件通用,可在不同平台(如 Linux 和 Windows 的开发环境)中移植。

4. make 工具的核心价值
  • 本质
    GNU make 是一种代码维护工具,专注于自动化构建和依赖管理。
  • 解决问题
    1. 大量代码的依赖维护
      • 项目庞大时,手工维护编译命令复杂且易错。
      • Makefile 明确定义依赖关系,自动化编译流程。
    2. 减少重复编译时间
      • 通过时间戳和依赖分析,仅重新编译修改过的文件。
      • 避免全量编译,节省开发时间。

5. make 的跨平台特性
平台使用方式
Linux/Unix需手动编写 Makefile 文件。
Windows通常由 IDE(如 Visual Studio)自动生成 Makefile 或等效脚本。

6. 示例:Makefile 的作用场景

假设项目包含以下文件:

  • main.c(依赖 utils.h
  • utils.c(依赖 utils.h

1. 基本结构

# 注释以 # 开头
目标(target): 依赖(dependencies)
    [Tab]命令(command)
部分说明
目标要生成的文件名或伪目标(如 clean
依赖目标所需的文件或其他目标
命令生成目标的 Shell 命令(必须用 Tab 缩进)

2. 示例:单文件编译

# 编译 main.c 生成可执行文件 app
app: main.c
    gcc main.c -o app

# 伪目标:清理生成的文件
.PHONY: clean
clean:
    rm -f app

3. 多文件编译与变量

# 定义变量
CC = gcc
CFLAGS = -Wall -O2
TARGET = app
SRCS = main.c utils.c
OBJS =   \)(SRCS:.c=.o)

# 默认目标
\(  (TARGET):   \)(OBJS)
    \(  (CC)   \)(CFLAGS) -o \(  @   \)^

# 隐式规则:将 .c 文件编译为 .o 文件
%.o: %.c
    \(  (CC)   \)(CFLAGS) -c \(  < -o   \)@

# 清理
.PHONY: clean
clean:
    rm -f \(  (TARGET)   \)(OBJS)

4. 自动变量

变量说明
\( @当前目标名(如 app
\)<第一个依赖文件名(如 main.c
\( ^所有依赖文件名(去重)
\)?比目标更新的依赖文件列表
\( *匹配通配符 % 的部分(如 %.c: %.o 中的 main

5. 函数与条件判断

# 查找所有 .c 文件
SRCS =   \)(wildcard *.c)

# 替换后缀生成 .o 文件
OBJS = \(  (patsubst %.c,%.o,  \)(SRCS))

# 条件判断
ifeq (\(  (DEBUG),1)
    CFLAGS += -g
else
    CFLAGS += -O2
endif

6. 伪目标与依赖链

.PHONY: all clean rebuild

# 默认目标
all: app

# 强制重建所有文件
rebuild: clean all

# 多目标定义
obj1 obj2: common.h
    echo "Building   \)@"

7. 头文件依赖自动生成

# 生成 .d 依赖文件
%.d: %.c
    \(  (CC) -M   \)< -o \(  @

# 包含所有 .d 文件
-include   \)(SRCS:.c=.d)

8. 常用命令选项

命令说明
make编译默认目标(第一个目标或名为 all 的目标)
make target编译指定目标(如 make clean
make -n模拟执行命令(不实际运行)
make -j4并行编译(4线程加速)

9. 完整示例

CC = gcc
CFLAGS = -Wall -Iinclude
LDFLAGS = -lm
TARGET = myapp
SRC_DIR = src
OBJ_DIR = obj

SRCS = \(  (wildcard   \)(SRC_DIR)/*.c)
OBJS = \(  (patsubst   \)(SRC_DIR)/%.c,\(  (OBJ_DIR)/%.o,  \)(SRCS))

# 主目标
\(  (TARGET):   \)(OBJS)
    \(  (CC)   \)^ -o \(  @   \)(LDFLAGS)

# 编译 .c 到 .o
\(  (OBJ_DIR)/%.o:   \)(SRC_DIR)/%.c
    @mkdir -p \(  (OBJ_DIR)
      \)(CC) \(  (CFLAGS) -c   \)< -o \(  @

# 清理
.PHONY: clean
clean:
    rm -rf   \)(TARGET) \(  (OBJ_DIR)

10. 最佳实践

  1. 目录分离:源码(src/)、头文件(include/)、对象文件(obj/)分开存放。
  2. 增量编译:合理设置依赖关系,避免全量编译。
  3. 变量管理:集中定义编译器、标志、路径等。
  4. 错误处理:在命令前加 - 忽略错误(如 -rm -f file)。
  5. 跨平台:避免使用 Shell 特有语法,或用 \)(SHELL) 指定解释器。

11. 常见错误

  • Tab 与空格混用:命令必须用 Tab 缩进。
  • 依赖缺失:未列出头文件导致修改后不重新编译。
  • 路径错误:未正确处理相对/绝对路径。
  • 变量覆盖:命令行参数优先级高于 Makefile 中的定义。

12.补充

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode876.链表的中间结点

目录 问题描述示例提示 具体思路思路一 代码实现 问题描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 题目链接&#xff1a;链表的中间结点 示例 提示 链表的结点数范围是 [1, 100]   1 &…

设计变更滞后导致生产计划混乱?PLM与MES集成实时同步

当产品设计在PLM系统中发生变更时&#xff0c;这些变更信息却无法及时、准确地传递到MES系统中。结果是&#xff0c;车间生产现场仍然按照旧的设计指令执行&#xff0c;导致生产出的产品与设计要求不符&#xff0c;不仅引发质量问题&#xff0c;还可能造成停工、物料浪费甚至客…

20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题

20250220解决使用top指令查看荣品PRO-RK3566开发板的CPU占用率为400%的问题 2025/2/20 19:14 缘起&#xff0c;使用荣品PRO-RK3566开发板配套的百度网盘中的SDK&#xff1a;Android13编译之后&#xff0c;查看RK3566的CPU占用率为400%。 开机就是400%&#xff0c;什么时候都是4…

巧用GitHub的CICD功能免费打包部署前端Node项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…

web 通识3

目录 6 通向3.0区块链技术前沿发展 7.主流区块链项目介绍 9.区块链行业应用总览 6 通向3.0区块链技术前沿发展 隔离见证&#xff1a;将一部分信息放在别的地方&#xff0c;这样原本的地方就可以容纳更多的东西 隔离见证和树图都是通过扩大容量来提高性能 闪电网络&#xf…

Hadoop一 HDFS分布式文件系统

一 分布式文件存储 了解为什么海量数据需要使用分布式存储技术 100T数据太大&#xff0c;单台服务器无法承担。于是&#xff1a; 分布式服务器集群 靠数量取胜&#xff0c;多台服务器组合&#xff0c;才能Hold住&#xff0c;如下 分布式不仅仅是解决了能存的问题&#xff…

java练习(33)

ps:题目来自力扣 最强回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 class Solution {public String longestPalindrome(String s) {if (s null || s.length() < 1) {return "";}int start 0, end 0;for (int i 0; i < s.length();…

分布式大语言模型服务引擎vLLM论文解读

论文地址&#xff1a;Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型&#xff08;LLMs&#xff09;的高吞吐量服务需要一次对足够多的请求进行批处理。然而&#xff0c;现有系统面临困境&#xff0c;因为每个请求的键值…

日期类(完全讲解版)

1. 类的设计思想 Date 类的设计目的是为了封装和处理日期信息&#xff0c;它提供了对日期的基本操作&#xff0c;如日期加减、日期比较、日期合法性检查等。类中的私有成员 int _year, int _month, int _day 存储了日期的年、月、日。 类的声明和构造 Date 类的声明&#xff1…

微信小程序(uni)+蓝牙连接+Xprint打印机实现打印功能

1.蓝牙列表实现&#xff0c;蓝牙设备展示&#xff0c;蓝牙连接 <template><view class"container"><view class"container_top"><view class"l">设备名称</view><view class"r">{{state.phoneNam…

zookeeper集群配置

配置 一、配置myid文件 # 进入解压好的文件夹下面 touch myid vim myid # master节点写0&#xff0c;slave1节点写1&#xff0c;slave2节点写2二、配置zoo.cfg文件 1.在master节点编辑zookeeper配置文件 # 进入解压好的文件夹下面 cd conf/ cp zoo_sample.cfg zoo.cfg vim …

C++ Primer 类的静态成员

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

Ubuntu 服务器Llama Factory 搭建DeepSeek-R1微调训练环境

1.首先了解一下什么是LLM微调 LLM 微调指的是在已经预训练好的大型语言模型基础上&#xff0c;使用特定的任务数据或领域数据&#xff0c;通过进一步的训练来调整模型的参数&#xff0c;使其在特定任务或领域上能够表现得更好。简单来说&#xff0c;就是对一个已经具备了丰富语…

C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串转换工具

文章目录 1. 传统转换方法的局限性2. std::to_chars&#xff1a;数值到字符串的高效转换函数原型&#xff1a;返回值&#xff1a;示例代码&#xff1a;输出&#xff1a; 3. std::from_chars&#xff1a;字符串到数值的高效解析函数原型&#xff1a;返回值&#xff1a;示例代码&…

【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

VScode 使用Deepseek又方便又好用的另一款插件

一、Continue continue类似于copilot&#xff0c;包含5大核心功能&#xff1a;AI对话编程、代码自动补全、代码智能编辑、上下文提供器、快捷键操作&#xff0c;能满足编程的大部分需求。 在AI大模型的支持上&#xff0c;continue能连接包括DeepSeek、OpenAI、Claude在内的十…

互联网 Java 工程师面试题(Java 面试题五)

JVM 底层 与 GC&#xff08;Garbage Collection&#xff09; 的面试问题 31、64 位 JVM 中&#xff0c;int 的长度是多数&#xff1f; Java 中&#xff0c;int 类型变量的长度是一个固定值&#xff0c;与平台无关&#xff0c;都是 32 位。意思就 是说&#xff0c;在 32 位 和 6…

【设计模式精讲】创建型模式之工厂方法模式(简单工厂、工厂方法)

文章目录 第四章 创建型模式4.2 工厂方法模式4.2.1 需求: 模拟发放奖品业务4.2.2 原始开发方式4.2.3 简单工厂模式4.2.3.1 简单工厂模式介绍4.2.3.2 简单工厂原理4.2.3.3 简单工厂模式重构代码4.2.3.4 简单工厂模式总结 4.2.4 工厂方法模式4.2.4.1 工厂方法模式介绍4.2.4.2 工厂…

pytorch cnn 实现猫狗分类

文章目录 [toc] 1. 导入必要的库2. 定义数据集类3. 数据预处理和加载4. 定义 CNN 模型5. 定义损失函数和优化器6. 训练模型7. 保存模型8. 使用模型进行预测9 完整代码10. 总结 1. 导入必要的库 import torch import torch.nn as nn import torch.optim as optim from torch.ut…

linux学习【7】Sourc Insight 4.0设置+操作

目录 1.Source Insight是什么&#xff1f;2.需要哪些配置&#xff1f;3.怎么新建项目4.一些问题的解决1.中文乱码问题 按照这个设置就可以了&#xff0c;下面的设置会标明设置理由。 1.Source Insight是什么&#xff1f; 阅读源码&#xff0c;编辑源码&#xff0c;不能编译&am…