Linux系统 C/C++编程基础——使用make工具和Makefile实现自动编译

ℹ️大家好,我是练小杰,今天周二了,距离除夕只有6天了,新的一年就快到了😆
本文是有关Linux C/C++编程的make和Makefile实现自动编译相关知识点,后续会不断添加相关内容 ~~
回顾:【Emacs编辑器、GCC编译器以及GDB调试器】
更多Linux 相关内容请点击👉【Linux专栏】

在这里插入图片描述

文章目录

  • make工具
    • 优点
    • 基本语法
    • make 的工作原理
  • Makefile基础
    • 配置文件基本结构
    • 配置文件说明
    • Makefile文件依赖关系链
    • Makefile的编译机制
  • Makefile的高级特性
    • 模式规则
    • 隐式规则
    • 伪目标
    • 使用通配符
    • 文件包含
  • make的工作方式
  • `Autotools`自动产生Makefile
    • Autotools工作原理
    • `configure`产生的Makefile文件
    • Autotools工具
    • Autotools应用示例

在这里插入图片描述

make工具

make 是一个根据依赖关系自动执行命令的工具。它主要用于编译源代码,但也可以用于其他需要根据文件变化自动执行任务的场景。
make 通过Makefile文件维护源程序,实现自动编译。

优点

  • 可自动化:减少手动编译的繁琐步骤。
  • 高效率:只重新编译发生变化的部分,节省时间。
  • 可维护性:通过 Makefile 集中管理构建过程,便于维护和理解。

基本语法

 make [选项] [目标名]
  • 主要选项

-f :描述文件,指定make编译所依据的描述文件(Makefile
-n:只显示生成指定目标的所有执行命令,但并不实际执行。
-p:输出Makefile文件中所有宏定义和目标文件描述。
-d:使用Debug(调试)模式。
-c :指定目录,在读取Makefile之前改变到指定的目录。

make 的工作原理

  1. 首先解析 Makefile:make 读取 Makefile,构建依赖关系图。
  2. 然后确定目标:如果没有指定目标,make 默认执行第一个目标(通常是 all)。
  3. 再检查依赖:对于每个目标,make 检查其依赖是否需要更新。
  4. 最后执行命令:如果依赖有更新或目标不存在,make 执行相应的命令生成目标。

Makefile基础

Makefilemake 的配置文件,定义了目标和依赖关系。
Makefile文件通过若干条规则来定义文件依赖关系。每条规则包括目标(target)、条件(prerequisites)和命令(command)三大要素。

配置文件基本结构

如下,是一个简单的Makefile示例

# 定义编译器
CC = gcc

# 定义编译选项
CFLAGS = -Wall -g

# 定义目标可执行文件
TARGET = myprogram

# 定义源文件
SRCS = main.c utils.c

# 生成目标文件列表
OBJS = $(SRCS:.c=.o)

# 默认目标
all: $(TARGET)

# 链接目标文件生成可执行文件
$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)

# 编译 .c 文件生成 .o 文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理生成的文件
clean:
	rm -f $(OBJS) $(TARGET)

配置文件说明

  • 目标(Target):要生成的文件或要执行的操作。例如,all 和 clean 都是目标。

  • 依赖(Prerequisites):生成目标所需的文件或目标。例如,$(TARGET) 依赖于 $(OBJS)

  • 命令(Commands):生成目标所需执行的命令。例如,$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)

  • 变量(Variables):用于存储可复用的字符串。例如,CC 存储编译器,CFLAGS 存储编译选项。

  • 自动变量

    $@:指明当前目标 。比如,在 %.o: %.c 规则中,$@ 代表 .o 文件。
    $<:指第一个依赖。比如,在 %.o: %.c 规则中,$< 代表 .c 文件。
    $^:指所有依赖。

Makefile文件依赖关系链

  • 这里我们通过一个Makefile示例来分析
#第1部分
textedit : main.o input.o output.o command.o files.o tools.o
cc -o textedit main.o input.o output.o command.o /
files.o utils.o
#第2部分
main.o : main.c def.h
cc -c main.c
input.o : input.c def.h command.h
cc -c input.c
output.o : output.c def.h buffer.h
cc -c output.c
command.o : command.c def.h command.h
cc -c command.c
files.o : files.c def.h buffer.h command.h
cc -c files.c
utils.o : tools.c def.h
cc -c tools.c
#第3部分
clean :
rm textedit main.o input.o output.o 
rm command.o files.o tools.o
  • 下面由一张图了解上述文件的依赖关系
    在这里插入图片描述

Makefile的编译机制

  • 如果该项目没有编译过,也就是没有生成过目标,那么就根据所给的条件来生成目标,所有源文件都要编译并进行连接。

  • 如果该项目已经编译过,生成有目标,一旦条件发生变化,则需要重新生成目标。

  • 若项目的某些源文件被修改,只编译被修改的源文件,并连接生成目标程序。

  • 如果项目的某些头文件改变,则需要编译引用了这些头文件的源文件,并连接生成目标程序。

  • make通过比较目标和条件中的文件的修改日期来识别文件是否被修改。如果条件中的文件的日期要比目标中的文件的日期要新,或者目标不存在,那么make就会执行后续定义的命令。

Makefile的高级特性

  • Makefile示例修改
#第1部分
objects = main.o input.o output.o command.o files.o utils.o
#第2部分
textedit : $(objects)
cc -o edit $(objects)
#第3部分
main.o : defs.h
input.o : defs.h command.h
command.o : defs.h command.h
output.o : defs.h buffer.h
insert.o : defs.h buffer.h
tools.o : defs.h
#第4部分
.PHONY : clean
clean :
rm edit $(objects)

模式规则

模式规则使用 % 通配符,可以匹配多个文件。

  • 表示所有 .o 文件都依赖于对应的 .c 文件
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

隐式规则

  • make 内置了一些隐式规则,可以使用命令 make -p 查看所有内置的隐式规则

比如:
.c 文件生成 .o 文件的规则。
.o 文件链接生成可执行文件的规则。

伪目标

伪目标并不是一个文件,只是一个标签

使用通配符

make支持通配符:“*”、“?”和“[...]”,用于代替一系列的文件。

文件包含

在一个Makefile文件中可以引用另一个Makefile文件。

make的工作方式

(1)读入所有的Makefile文件。
(2)读入被include语句嵌入的其他Makefile文件。
(3)初始化这些文件中的变量。
(4)推导隐式规则,并分析所有规则。
(5)为所有的目标文件创建依赖关系链。
(6)根据依赖关系,决定哪些目标需要重新生成。
(7)执行生成目标的命令。

Autotools自动产生Makefile

Autotools工作原理

  • 一个Autotools项目至少需要一个名为configure的配置脚本和一个名为Makefile.in的Makefile模板。
  • 实际上并不需要Autotools来建立Autotools包,configure是在最基本的Shell(sh)上运行的Shell脚本,它检查用户系统获取每个特征,通过模板写出Makefile文件。
  • configure在每个目录中创建所有文件,并且在命令行接受几个选项用于在不同的目录中安装文件。

configure产生的Makefile文件

configure产生的Makefile文件很标准,它们定义由GNU标准所需的所有标准目标,常用的目标如下所示。

  • makemake all:创建程序
  • make install:安装程序
  • make distclean:删除由configure产生的所有文件

Autotools工具

  • Autoconf:用于生成 configure 脚本,检测系统特性和依赖关系。

  • Automake:用于根据 Makefile.am 文件生成 Makefile.in 文件。

  • Libtool:用于简化共享库的管理和编译。

  • Autotools 的辅助工具:

Autoheader:用于生成 config.h.in
AutoMake: 用于处理 Makefile.am 中的条件语句。

Autotools应用示例

  • 步骤如下

(1)准备源代码。
(2)切换到项目工作目录,执行命令autoscan命令扫描工作目录生成configure.scan文件。
(3)将文件configure.scan重命名为configure.ac,然后再编辑修改这个配置文件。
(4)项目目录下执行aclocal命令,扫描configure.ac文件生成aclocal.m4文件。
(5)项目目录下执行autoconf命令生成configure文件。
(6)项目目录下执行autoheader命令生成config.h.in文件。
(7)项目目录下创建一个Makefile.am文件,供automake工具根据configure.in中的参数将Makefile.am转换成Makefile.in文件。
(8)在项目目录下执行automake命令生成Makefile.in文件。通常要使用选项--add-missing让automake自动添加一些必需的脚本文件。
(9)在项目目录下执行./congigure命令,基于Makefile.in生成最终的Makefile文件。该命令将一些配置参数添加到Makefile文件中。
(10)在项目目录下执行make命令,基于Makefile文件编译源代码文件并生成可执行文件。
(11)在项目目录下执行make install命令将编译后的软件包安装到系统中。
(12)如果要对外发布,可以在项目目录下执行make dist命令将程序和相关的文档打包为一个压缩文档。

晚上好,今天Linux的相关内容到这里就结束了😆
如果想了解更多,点击主页【练小杰的CSDN】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!!
明天再见啦,各位🧍‍♂️大佬们~~

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

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

相关文章

系统思考—转型

我们大多数问题的来源是&#xff1a;人们的思考方式与大自然的运作方式之间的差异。——葛雷果利贝特森&#xff08;人类学家、生物学家及系统思考先驱&#xff09; 在企业转型的过程中&#xff0c;许多企业创始人常常面临一个困境——过去的成功经验和旧有的思维方式&#xf…

【Linux系统】—— 编译器 gcc/g++ 的使用

【Linux系统】—— 编译器 gcc/g 的使用 1 用 gcc 直接编译2 翻译环境2.1 预处理&#xff08;进行宏替换&#xff09;2.2 编译&#xff08;生成汇编&#xff09;2.3 汇编&#xff08;生成机器可识别代码&#xff09;2.4 链接2.5 记忆小技巧2.6 编译方式2.7 几个问题2.7.1 如何理…

LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS

题目 大型语言模型是人类级别的提示工程师 论文地址&#xff1a;https://arxiv.org/abs/2211.01910 项目地址&#xff1a;https://github.com/keirp/automatic_prompt_engineer 摘要 通过对自然语言指令进行调节&#xff0c;大语言模型 (LLM) 显示了作为通用计算机的令人印象深…

计算机的错误计算(二百一十八)

摘要 大模型能确定 sin(2.6^100) 的符号吗&#xff1f;实验表明&#xff0c;大模型给的结论是正确的&#xff0c;但其证明过程是错误百出。大模型的推理实在是不敢恭维。 就同样题目&#xff0c;测试一下另外一个大模型。 例1. 能确定 sin(2.6^100) 的符号吗&#xff1f; 下…

51c~SLAM~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM&#xff1a;A General SLAM Framework and Benchmark 开源代码&#xff1a;https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…

【2024年终总结】我与CSDN的一年

&#x1f449;作者主页&#xff1a;心疼你的一切 &#x1f449;作者简介&#xff1a;大家好,我是心疼你的一切。Unity3D领域新星创作者&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6; &#x1f449;记得点赞 &#x1f44d; 收藏 ⭐爱你们&#xff0c;么么哒 文章目录 …

Day 14 卡玛笔记

这是基于代码随想录的每日打卡 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;r…

51c大模型~合集105

我自己的原文哦~ https://blog.51cto.com/whaosoft/13101924 #刚刚&#xff0c;ChatGPT开始有了执行力&#xff01; 现在 AI 智能体可以 24*7 小时为你打工。 2025 刚过去了半个月&#xff0c;OpenAI 在智能体领域「开大」了。 今天&#xff0c;OpenAI 正在为 ChatGPT 推出…

《Effective Java》学习笔记——第2部分 对象通用方法最佳实践

文章目录 第2部分 所有对象通用方法一、前言二、最佳实践内容1. equals()方法2. hashCode()方法3. toString() 方法4. clone() 方法5. finalize() 方法6. compareTo()方法&#xff08;实现 Comparable 接口&#xff09; 三、小结 第2部分 所有对象通用方法 一、前言 《Effect…

国家统计局湖北调查总队副总队长张小青一行调研珈和科技农业遥感调查智能化算法

1月15日上午&#xff0c;国家统计局湖北调查总队党组成员、副总队长张小青一行莅临珈和科技开展调研。调研期间&#xff0c;张小青一行实地了解了珈和科技在自动化作物分布提取技术领域的最新成果&#xff0c;深入探讨了作物自动化处理模型在农业调查上应用的创新价值及优化方向…

2025-1-21 Newstar CTF web week1 wp

文章目录 week1headach3会赢吗智械危机 week1 headach3 根据提示&#xff0c;在页面的请求头里找到flag flag{You_Ar3_R3Ally_A_9ooD_d0ctor} 会赢吗 打开控制台&#xff0c;拿到第一部分flag 将地址栏改为提示&#xff0c;去到下一关 控制台调用函数&#xff0c;得到flag …

CPU狂飙900%如何分析?怎么定位?怎么溯源处理

当你的服务器CPU飙升到900%&#xff0c;系统卡顿、响应迟缓、业务受阻&#xff0c;这种令人焦虑的场景是否让你束手无策&#xff1f;别慌&#xff0c;这并不是世界末日&#xff0c;只要掌握正确的分析与定位方法&#xff0c;就能快速找到问题根源&#xff0c;并有效解决。 CPU…

leetcode919. 完全二叉树插入器,队列只保存右子树为空的节点

leetcode919. 完全二叉树插入器 完全二叉树 是每一层&#xff08;除最后一层外&#xff09;都是完全填充&#xff08;即&#xff0c;节点数达到最大&#xff09;的&#xff0c;并且所有的节点都尽可能地集中在左侧。 设计一种算法&#xff0c;将一个新节点插入到一棵完全二叉树…

Mysql安装,mysql-installer-community-8.0.41.0

“windowR"键弹出运行框&#xff0c;输入”cmd"进入window命令提示符&#xff0c;输入“mysql -uroot -p"按下回车&#xff0c;再输入密码&#xff0c;按下回车&#xff0c;出现下面界面则是配置成功。 默认会在 C:\Program Files\MySQL\MySQL Server 8.0\bin …

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

1.21学习记录

misc 2023isctf 你说爱我尊嘟假嘟 这题有点脑洞&#xff0c;需要把你说爱我换成Ook.将尊嘟换为Ook&#xff01;假嘟换成Ook&#xff1f;&#xff08;根据语气进行猜测吧&#xff09;用在线工具解密最后用base64解密即可 2023isctf 杰伦可是流量明星 解压后是一个MP3文件&am…

BaseCTF_Misc_week3

目录 broken.mp4 白丝上的flag 这是一个压缩包 纯鹿人 外星信号 我要吃火腿 Base Revenge broken.mp4 附件两个MP4文件&#xff0c;第一个可以播放&#xff0c;内容是视频受损的修复啥的。第二个破损了&#xff0c;那么就根据第一个视频的网页名称搜索找到相应的网页&…

Flutter项目和鸿蒙平台的通信

Flutter项目和鸿蒙平台的通信 前言Flutter和Harmonyos通信MethodChannelBasicMessageChannelEventChannel 前言 大家在使用Flutter开发项目的时候&#xff0c; Flutter提供了Platfrom Channel API来和个个平台进行交互。 Flutter官方目前提供了一下三种方式来和个个平台交互&…

@TransactionEventListener的关键源码整理

前言&#xff1a;本篇文章不属于保姆级的&#xff0c;主要是方便自己回忆用的&#xff0c;所以需要阅读者具有一定的Spring源码基础。 总结&#xff1a; TransactionEventListener本质上还是EventListener&#xff0c;事件的发布还是Spring通用的那一套事件发布机制。EventLis…

StarRocks强大的实时数据分析

代码仓库&#xff1a;https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始&#xff1a;StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化…