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】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!!
明天再见啦,各位🧍‍♂️大佬们~~

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

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

相关文章

68,[8] BUUCTF WEB [RoarCTF 2019]Simple Upload(未写完)

<?php // 声明命名空间&#xff0c;遵循 PSR-4 自动加载规范&#xff0c;命名空间为 Home\Controller namespace Home\Controller;// 导入 Think\Controller 类&#xff0c;以便扩展该类 use Think\Controller;// 定义 IndexController 类&#xff0c;继承自 Think\Control…

可以自己部署的微博 Mastodon

Mastodon&#xff08;又称乳齿象、长毛象或万象&#xff09;是一个自由开源的去中心化的分布式微博客社交网络。它的用户界面和操作方式跟推特&#xff08;Twitter&#xff09;类似&#xff0c;但整个网路并非由单一机构运作&#xff0c;而是以多个由不同营运者独立运作的伺服器…

机器学习-核函数(Kernel Function)

核函数&#xff08;Kernel Function&#xff09;是一种数学函数&#xff0c;主要用于将数据映射到一个更高维的特征空间&#xff0c;以便于在这个新特征空间中更容易找到数据的结构或模式。核函数的主要作用是在不需要显式计算高维特征空间的情况下&#xff0c;通过内积操作来实…

AQS公平锁与非公平锁之源码解析

AQS加锁逻辑 ReentrantLock.lock public void lock() {sync.acquire(1);}AbstractQueuedSynchronizer#acquire public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();}addWaiter就是将节点加入…

软件授权产品介绍

CodeMeter技术可提供高达40亿个授权模块&#xff0c;其中6000个可存放于硬件加密狗CmDongle中&#xff0c;其他可存放于软授权CmActLicense中按需激活&#xff0c;CodeMeter云授权CmCloud也可以无任何限制的为“云中软件”提供灵活的授权控制。 CodeMeter安全时钟模块采用了独…

Excel 技巧17 - 如何计算倒计时,并添加该倒计时的数据条(★)

本文讲如何计算倒计时&#xff0c;并添加该倒计时的数据条。 1&#xff0c;如何计算倒计时 这里也要用公式 D3 - TODAY() 显示为下面这个样子的 然后右键该单元格&#xff0c;选 设置单元格格式 然后点 常规 这样就能显示出还书倒计时的日数了。 下拉适用到其他单元格。 2&a…

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…

C++ 类与对象(上)

在C中&#xff0c;在原来C语言基础上引入了类的概念。与C语言最大的不同就是&#xff1a;C可以在类中定义函数。由类声明的变量&#xff0c;称为对象。 1.类的定义 1.1类定义的格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;…

什么样的问题适合用递归

递归是一种通过函数调用自身来解决问题的方法。递归适用于那些可以被分解为相似子问题的问题&#xff0c;即原问题可以通过解决一个或多个更小规模的同类问题来解决。递归通常需要满足以下两个条件&#xff1a; 递归基&#xff08;Base Case&#xff09;&#xff1a;问题的最简…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

【物联网】keil仿真环境设置 keilV5可以适用ARM7

文章目录 一、ARM指令模拟器环境搭建1. keil软件2. Legacy Support 二、Keil仿真环境设置1. 创建一个项目2. 编译器介绍(1)arm-none-eabi-gcc(2)arm-none-linux-gnueabi-gcc(3)arm-eabi-gcc(4)grmcc(5)aarch64-linux-gnu-gcc 3. 安装编译器(1)设置调试 一、ARM指令模拟器环境搭…

StackOrQueueOJ3:用栈实现队列

目录 题目描述思路分析开辟队列入队列出队列 代码展示 题目描述 原题&#xff1a;232. 用栈实现队列 思路分析 有了前面的用队列实现栈的基础我们不难想到这题的基本思路&#xff0c;也就是用两个栈来实现队列&#xff0c;&#xff08;栈的实现具体参考&#xff1a;栈及其接口…

二叉树--堆排序

我们之前学过冒泡排序算法&#xff0c;还有其他的排序算法之类的&#xff0c;我们今天来讲堆排序算法&#xff1b; 假设我们现在有一个数组&#xff0c;我们想要对其进行排序&#xff0c;我们可以使用冒泡排序来进行排序&#xff1b;我们也可以使用堆排序来进行排序&#xff1b…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证

第一种基于binlog的主从同步 首先对主库进行配置&#xff1a; [rootopenEuler-1 ~]# vim /etc/my.cnf 启动服务 [rootopenEuler-1 ~]# systemctl enable --now mysqld 主库的配置 从库的配置 第一个从库 [rootopenEuler-1 ~]# vim /etc/my.cnf [rootopenEuler-1 ~]# sys…

【技术总结类】2024,一场关于海量数据治理以及合理建模的系列写作

目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线&#xff0c;也是2025要继续的主线 1.今年的创作路线 今年的写作内…

用于牙科的多任务视频增强

Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上&#xff0c;这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…

Hnu电子电路实验2

目录 【说明】 与本次实验相关的代码及报告等文件见以下链接&#xff1a; 一、实验目的 二、实验内容 三&#xff1a;实验原理 1.指令译码器 2.AU 算术单元 四&#xff1a;实验过程 1.指令译码器 A&#xff09;创建工程&#xff08;选择的芯片为 familyCyclone II&am…

C语言之图像文件的属性

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 图像文件属性提取系统设计与实现 目录 设计题目设计内容系统分析总体设计详细设计程序实现…

AI 新动态:技术突破与应用拓展

目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最具影响力的领域之一。AI 技…

ElasticSearch DSL查询之排序和分页

一、排序功能 1. 默认排序 在 Elasticsearch 中&#xff0c;默认情况下&#xff0c;查询结果是根据 相关度 评分&#xff08;score&#xff09;进行排序的。我们之前已经了解过&#xff0c;相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…