make工程管理器与Makefile

news2025/1/12 21:14:05

目录

一、介绍

1、make工程管理器

2、Makefile

二、Makefile语法规则

1、Makefile语法格式

2、Makefile中特殊处理与伪目标 

3、变量、规则与函数

(1)自定义变量使用示例

(2)自动变量使用示例


一、介绍

1、make工程管理器

定义

        make是一个命令工具,它根据文件的时间戳自动发现更新过的文件,从而减少编译的工作量。make工程管理器因此得名“自动编译管理器”

工作原理:        

        make命令会在当前目录下寻找名为“Makefile”或“makefile”的文件。如果找到,它会查找文件中的第一个目标文件(target),并将其作为最终的目标文件。如果目标文件不存在,或者目标文件所依赖的文件的修改时间比目标文件新,那么make会执行后面所定义的命令来生成目标文件。make会递归地检查依赖关系,直到所有目标都更新完成。

2、Makefile

定义:

        Makefile是用于管理项目构建过程的文件,它包含了构建项目的规则。make命令会读取Makefile文件中的内容来执行大量的编译工作。

基本语法:

目标(Target):需要生成的文件,例如可执行文件。

依赖(Dependencies):生成目标所依赖的文件或目标。

命令(Commands):构建目标时需要执行的命令,这些命令必须以Tab键开头。

总结:

make 和Makefile的作用

第一个:减少编译工作量,节约编译时间

第二个:简化编译操作,编译命令-->放到Makefile

二、Makefile语法规则

1、Makefile语法格式

基本格式:(要求)

第一行:Target(目标):dependency_files(依赖)

类似:main:main.o     ---例如:a.c (预处理  预编译  汇编  链接)a.out

第二行:TAB键(必须) command---->解释:必须以TAB键开头,command为编译命令  

类似:按下Tab键 gcc main.o -o main

示例:编写一个基本的Makefile文件

代码:

test:a.o
	gcc a.o -o test
a.o:a.c
	gcc -c a.c -o a.o
clean:
	rm test

说明: 

目标(target)和依赖(dependency)关系:

test: a.o:这一行定义了一个名为test的目标,它依赖于文件a.o。这意味着,当a.o文件被更新(或者不存在)时,make工具会执行后面指定的命令来生成或更新test。

a.o: a.c:这定义了一个名为a.o的目标,它依赖于文件a.c。如果a.c文件被修改,make会重新编译a.c来生成或更新a.o。

命令(command):

gcc a.o -o test:这是生成test目标的命令。它告诉gcc将a.o链接成一个可执行文件,文件名为test。

gcc -c a.c -o a.o:这是生成a.o目标的命令。-c选项告诉gcc只编译和汇编a.c,不进行链接,输出为对象文件a.o。

伪目标(phony target):

clean:这是一个伪目标,它不对应任何文件名。通常用于执行清理工作,比如删除编译生成的文件。

rm test:这是clean目标对应的命令,用于删除可执行文件test。

2、Makefile中特殊处理与伪目标 

        伪目标并不是文件,而是一种命令名称,可以用于执行一些常见的操作,如清理构建文件。它们通常定义为.PHONY: clean,然后后面跟上具体的清理命令,如:

clean:

        rm -f *.o main

注意:在运行make的必须指定才能运行

示例:

现象:

 代码:

test:a.o

        gcc a.o -o test

a.o:a.c

        gcc -c a.c -o a.o

.PHONY:clean a

clean:

        rm test a.o

a:

        cp a.c aa.c

3、变量、规则与函数

(1)自定义变量使用示例

变量的定义格式为VARIABLE_NAME = value,在引用变量时使用$(VARIABLE_NAME)

变量名区分大小写。注意:#表示注释行

赋值变量的4种方法:

变量名=变量的值

例子:  A=3

变量名:=变量值  解释:覆盖之前的值,通常采用这种方式

例子:  A=123

变量名 += 变量值

例子:   B=123

         B+=4,此时,B的值为1234

变量名 ?= 变量值   如果这个变量没有赋值就给它赋值

示例:操作赋值变量

现象:

代码:

A=123
A=1234
A+=5
B?=666

test:a.o
	gcc a.o -o test
a.o:a.c
	gcc -c a.c -o a.o
.PHONY:clean a
clean:
	@echo -e $(A)
	@echo -e $(B)
a:
	ls
(2)自动变量使用示例

自动变量:系统内部使用的时候,自动用特定的值进行替换

变量说明

$@ 当前规则下的目标文件

$< 当前规则下的第一个依赖文件

$^ 当前规则下的所有依赖文件,以逗号分隔

gcc命令

-c 编译 不链接

-o 输出指定的文件 test  main  main.o

@:作用是取消命令执行的时候回显

示例1:自定义变量替换变量编译生成一个可执行程序

现象:

代码:

E=123
E=1234
E+=5
G?=666
SCR?=a.o b.o c.o
A=a.o
B=b.o
C=c.o
A_C=a.c
B_C=b.c
C_C=c.c
T=test
CC=gcc
P=-c
M=-o

$(T):$(SCR)
	$(CC) $^ $(M) $@
$(A):$(A_C)
	$(CC) $(P) $< $(M) $@
$(B):$(B_C)
	$(CC) $(P) $< $(M) $@
$(C):$(C_C)
	$(CC) $(P) $< $(M) $@
.PHONY:clean a b
clean:
	rm *.o test
a:
	@echo -e $(E)
	@echo -e $(G)
b:
	ls
	
	

示例2:同时编译生成多个可执行程序

现象:

代码:

all:main1 main2 
main1:main1.c
	gcc main1.c -o main1
main2:main2.c
	gcc main2.c -o main2

总结:1:Makefile工程管理工具---管理多个源代码的---一次编译多个源文件。

           2:Makefile可以生成不同的可执行程序。

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

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

相关文章

【git】-2 分支管理

目录 一、分支的概念 二、查看、创建、切换分支 1、查看分支-git branch 2、创建分支- git branch 分支名 3、切换分支- git checkout 分支名 三、git指针 -实现分支和版本间的切换 四、普通合并分支 git merge 文件名 五、冲突分支合并 ​​​​​​【git】-初始gi…

3DGabor滤波器实现人脸特征提取

import cv2 import numpy as np# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # 相位偏移# 生成 Gabor 滤…

接口项目架构流程图-thinkphp6-rabbitmq

一、整个系统流程 第一步&#xff1a;平台在创建好后开启消息队列&#xff1b; 第二步&#xff1a;平台为需要服务的客户开好账号并传输对应的公私钥文件&#xff1b; 第三步&#xff1a;客户通过平台分享的接口连接地址采用开户时的手机号查看&#xff1b; 第四步&#xff1a;…

Vue3初学之组件通信

一起进行学习&#xff1a; 在 Vue 3 中&#xff0c;组件通信是一个非常重要的概念&#xff0c;它决定了如何在父子组件之间、兄弟组件之间以及跨层级组件之间传递数据和事件。以下是 Vue 3 中常见的组件通信方式&#xff1a; 父子组件通信 1.1 父组件向子组件传递数据&#x…

2025年第三届“华数杯”国际大学生数学建模竞赛【A题】Problem A: Can He Swim Faster

问题1&#xff1a;运动员的出色比赛表现通常得益于艰苦且持续的专业训练&#xff0c;这不仅提升了游泳技能&#xff0c;也增强了生理储备。比赛中&#xff0c;科学控制游泳速度是关键&#xff0c;包括保持个人节奏、寻求最佳身体状态节奏和合理分配体力。针对自由泳项目&#x…

【计算机网络】lab4 Ipv4(IPV4的研究)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

ELFK日志采集实战

一、日志分析概述 日志分析是运维工程师解决系统故障&#xff0c;发现问题的主要手段 日志主要包括系统日志、应用程序日志和安全日志 系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因 经常分析日志可以了解服务器的负荷&#x…

辅助--Inspector

辅助–Inspector 1.Introduction This manual explains how to use the Inspector. 1.1.Overview Inspector is a Qt-based library that provides functionality to interactively inspect low-level content of the OCAF data model, OCCT viewer and Modeling Data. Thi…

如何播放视频文件

文章目录 1. 概念介绍2. 使用方法2.1 实现步骤2.2 具体细节3. 示例代码4. 内容总结我们在上一章回中介绍了"如何获取文件类型"相关的内容,本章回中将介绍如何播放视频.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 播放视频是我们常用的功能,不过Flutter官方…

R数据分析:多分类问题预测模型的ROC做法及解释

有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲ROC在多…

【数据库】四、数据库管理与维护

文章目录 四、数据库管理与维护1 安全性管理2 事务概述3 并发控制4 备份与恢复管理 四、数据库管理与维护 1 安全性管理 安全性管理是指保护数据库&#xff0c;以避免非法用户进行窃取数据、篡改数据、删除数据和破坏数据库结构等操作 三个级别认证&#xff1a; 服务器级别…

C语言gdb调试

目录 1.gdb介绍 2.设置断点 2.1.测试代码 2.2.设置函数断点 2.3.设置文件行号断点 2.4.设置条件断点 2.5.多线程调试 3.删除断点 3.1.删除指定断点 3.2.删除全部断点 4.查看变量信息 4.1.p命令 4.2.display命令 4.3.watch命令 5.coredump日志 6.总结 1.gdb介绍…

winform第三方界面开源库AntdUI的使用教程保姆级环境设置篇

1. AntdUI 1.1. 导入项目 1.1.1. 首先新建一个空白的基于.net的Winfrom项目1.1.2. 复制AntdUI中src目录到我们的解决方案下面1.1.3. 解决方案下添加现有项目1.1.4. 添加项目引用 1.2. 编写代码 1.2.1. 改写Form1类&#xff0c;让其继承自public partial class Form1 : AntdUI.W…

记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据

文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据&#xff0c;页面卡死&#xff0c;如何优化&#xff1f;&#xff1f;这里使用 分页 虚拟列表&#xff08;vue-virtual-scroll-list&#xff09;&#xff0c;去模拟一个下拉的内容…

企业开通部署 Azure OpenAI 流程:如何创建一个AI聊天机器人

由于众所周知的原因&#xff0c;国内没法直接调用 OpenAI 接口。 下面我将演示企业如何开通 Azure OpenAI 服务&#xff0c;以及如何使用 C# 调用 Azure OpenAI 接口创建一个 Console 应用程序并实现聊天机器人功能。 1开通 Azure OpenAI 服务 要开通 Azure OpenAI 服务&…

CNN Test Data

由于数据量过大&#xff0c;打不开了 搞一组小的吧。收工睡觉 https://download.csdn.net/download/spencer_tseng/90256048

STM32使用ITM调试_通过仿真器实现串口打印

IDE&#xff1a;CLion MCU: STM32F407VET6 工具&#xff1a;OpenOCD Telnet 一、简介 调试单片机时&#xff0c;如果要打印数据往往需要另接一根线通过USB转TTL接到电脑上。但这样做往往并不方便&#xff0c;尤其是身边没有USB转TTL工具时。这时可以使用单片机自带的ITM单元…

Ubuntu 磁盘修复

Ubuntu 磁盘修复 在 ubuntu 文件系统变成只读模式&#xff0c;该处理呢&#xff1f; 文件系统内部的错误&#xff0c;如索引错误、元数据损坏等&#xff0c;也可能导致系统进入只读状态。磁盘坏道或硬件故障也可能引发文件系统只读的问题。/etc/fstab配置错误&#xff0c;可能…

RT-DETR融合[AAAI2025]的ConSeg中的CDFAPreprocess模块

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《ConDSeg: A General Medical Image Segmentation Framework via Contrast-Driven Feature Enhancement》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2412.083…

线程与互斥锁

一、线程 1、定义 进程的创建、销毁与切换存在着较大的时空开销&#xff0c;因此人们急需一种轻型的进程技术来减少开销。在80年代&#xff0c;线程的概念开始出现&#xff0c;线程被设计成进程的一个执行路径&#xff0c;同一个进程中的线程共享进程的资源&#xff0c;因此系…