【Linux】详解Linux中的Makefile文件

news2025/3/13 7:32:42

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、Makefile文件介绍
    • 为什么需要编写Makefile文件
    • Makefile的执行原理
    • 如何判断源文件是否被修改?
    • Makefile文件的优点
  • 二、创建编写Makefile文件
    • Makefile文件三要素
    • Makefile文件的注意事项
  • 三、Makefile变量的定义和使用
    • 1.自定义变量
    • 2.内置变量
    • 3.常用变量
  • 四、Makefile的内置函数和内建语法
    • 1.wildcard
    • 2.patsubst
    • 3.内建语法
  • 五、Makefile的功能目标

一、Makefile文件介绍

Makefile文件是Linux中用于编译和链接的自动化工具,是GNU工具(vi、gdb、makefile)的一部分。

为什么需要编写Makefile文件

程序的生成过程分为:编译期(源文件.c编译生成.o文件)和链接期(把所有.o文件链接生成可执行文件)。如果程序更新,下次生成可执行文件会对所有文件再次执行这个生成过程。因此需要Makefile文件,在修改源文件后,只编译修改后的文件,节省编译时间。

Makefile的执行原理

程序第一次编译时,会保存所有生成的中间文件.o文件,下次编译时只编译修改的源文件,重新生成.o文件,没有修改的.o文件无需再次编译,直接使用保存过的.o文件,一起链接生成可执行文件。

Makefile在编译期简化编译

如何判断源文件是否被修改?

通过比较源文件的修改时间和对应的.o文件的生成时间,如果修改时间更新,说明源文件被修改,需要重新编译。

Makefile文件的优点

  • 重用性强(一次编译终身受益),可以重复使用管理不同的项目
  • 能够更便捷地编译、管理代码,不用每次都重复书写复杂的编译命令
  • 只编译修改过的文件,节省编译时间

二、创建编写Makefile文件

命名:必须以makefile或Makefile命名
注释:#
执行Makefile文件:make

Makefile文件三要素

  • 1.目标:完成编译,生成可执行文件,可执行文件的名字就是目标
  • 2.依赖:源文件或者资源文件
  • 3.命令:根据依赖生成目标要执行的命令

编写makefile文件的格式:

目标:依赖
	命令

命令前面是一个Tab键

Makefile文件的注意事项

  • 自顶向下建立依赖关系
  • 默认只有一个最终目标(写在最上面),可以有多个中间目标

三、Makefile变量的定义和使用

1.自定义变量

没有数据类型,默认为字符串类型

变量名可以由字母、数字、下划线构成,不能以数字开头

为了与高级语言区分,一般使用全大写定义变量

使用变量:

	$(变量名)

2.内置变量

  • $@:表示目标名
  • $^:表示所有依赖项
  • $<:表示第一个依赖项

3.常用变量

#1.存储目标名
TARGET=myapp
#2.存储编译期版本
CC=gcc
#3.存储头文件路径
INCLUDE_PATH=../include
#4.存储库文件路径
LIBRARY_PATH=../lib
#5.存储安装路径
INSTALL_PATH=/user/bin
#6.存储编译选项
CFLAGS=-I$(INCLUDE_PATH) -c -Wall
#7.预处理选项
CPPFLAGS=-D

四、Makefile的内置函数和内建语法

1.wildcard

文件名处理函数:获取某个路径下的所有文件名

例如:获取当前路径下所有的.c文件名,存储到变量SOURSEFILE中

SOURSEFILE=$(wildcard *.c)

2.patsubst

字符串替换函数:在指定的文本中查找符合模式的字符串进行替换

例如:把变量SOURSEFILE中的所有.c文件改为.o文件

DFILE=$(patsubst %.c,%.o,$(SOURSEFILE))

3.内建语法

将.c文件编译成.o文件(头文件依赖在上层include文件夹中):

%.o:%.c
	gcc -c $< -I../include

五、Makefile的功能目标

功能目标没有依赖,只有命令

1.删除

clean:
	rm -rf $(DFILE) $(TARGET)

2.安装

install:
	sudo cp $(TARGET) $(INSTALL_PATH)

3.卸载

uninstall:
	sudo rm -rf $(INSTALL_PATH)/$(TARGET)

卸载时如果不小心多了空格,将会删除整个文件夹!可以先进行输出确认后再删除

4.输出

output:
	echo $(INSTALL_PATH)/$(TARGET)

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

idea无法通过vpn连接到数据库

本人之前遇到情况当打开vpn时&#xff0c;使用工具navicat可以连接到数据库&#xff0c;但是IDEA连接不到。这就很奇怪了&#xff0c;于是在网上大量搜寻解决方案&#xff0c;终于找到&#xff1a; 连接异常&#xff1a; 因为是Springboot项目&#xff0c;可以在启动类的配置…

SLAM从入门到精通(dwa速度规划算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 要说搜路算法&#xff0c;这个大家都比较好理解。毕竟从一个地点走到另外一个地点&#xff0c;这个都是直觉上可以感受到的事情。但是这条道路上机…

入侵检测代码

在人工智能中有个入侵检测&#xff1a;当检测到的目标位于指定区域内才算是入侵&#xff0c;思路很简单&#xff0c;判断相关坐标即可&#xff1a; from matplotlib import pyplot as plt, patches from shapely.geometry import Polygon, Pointdef is_intrusion(target_box, …

HTML基础入门03

1.表单标签 表单是让用户输入信息的重要途径. 分成两个部分: 表单域: 包含表单元素的区域. 重点是 form 标签. 表单控件: 输入框, 提交按钮等. 重点是 input 标签. 1.1form标签 <form action"test08.html">hello world </form> 描述了要把数据按照什…

特斯拉pre-test (Go)

特斯拉pre-test &#xff08;Go&#xff09; 1 Q12 Q23 Q3 1 Q1 原文&#xff1a; You are given an implementation of a function Solution that, given a positive integer N, prints to standard output another integer, which was formed by reversing a decimal repres…

互联网Java工程师面试题·Java 总结篇·第五弹

目录 47、Java 语言如何进行异常处理&#xff0c;关键字&#xff1a;throws、throw、try、catch、finally 分别如何使用&#xff1f; 48、运行时异常与受检异常有何异同&#xff1f; 49、列出一些你常见的运行时异常&#xff1f; 50、阐述 final、finally、finalize 的区别…

【Java学习之道】指引篇:从入门到入世

引言 你是否曾为找不到适合自己的Java学习之路而烦恼&#xff1f;是否想摆脱混乱的Java知识体系&#xff0c;找到一条从入门到精通的捷径&#xff1f;来《Java学习之道》吧&#xff0c;本专栏为你量身打造&#xff0c;让我们一起轻松踏上Java学习之旅&#xff01; 第一章、Jav…

AD620A运算放大器的原理、应用和性能特点 | 百能云芯

在电子领域&#xff0c;AD620A是一种广泛应用的运算放大器&#xff0c;也被称为运放。它在信号放大、传感器接口和测量应用中扮演着重要的角色。接下来云芯将带您深入探讨AD620A运放的原理、应用领域以及性能特点&#xff0c;以帮助您更好地理解它的作用和价值。 AD620A是一种精…

CentOS有IP地址,连接不上Xshell或使用Xshell时突然断开

问题原因&#xff1a;未在电脑主机的网络中进行IP地址配置 解决办法&#xff1a; 1.打开控制面板&#xff0c;选择‘网络与共享中心’ 2.选择“更改适配器设置” 3.右键点击以太网3“属性” 4.选择协议版本4&#xff0c;点击属性 5.IP地址填写CentOS的IP地址&#xff1a;192.…

微信小程序进阶——Flex弹性布局轮播图会议OA项目(首页)

目录 一、Flex弹性布局 1.1 什么是Flex弹性布局 1.1.1 详解 1.1.2 图解 1.1.3 代码演示效果 1.2 Flex弹性布局的核心概念 1.3 Flex 弹性布局的常见属性 1.4 Flex弹性布局部分属性详解 1.4.1 flex-direction属性 1.4.2 flex-wrap属性 1.4.3 flex-flow属性 1.4.4 ju…

Redis数据结构之quicklist

前言 为了节省内存&#xff0c;Redis 推出了 ziplist 数据类型&#xff0c;采用一种更加紧凑的方式来存储 hash、zset 元素。因为查找的时间复杂度是 O(N)&#xff0c;且写入需要重新分配内存&#xff0c;所以它仅适用于小数据量的存储&#xff0c;而且它还存在 连锁更新 的风…

Redis AOF持久化和ReWrite

前言 Redis 的 RDB 持久化机制简单直接&#xff0c;把某一时刻的所有键值对以二进制的方式写入到磁盘&#xff0c;特点是恢复速度快&#xff0c;尤其适合数据备份、主从复制场景。但如果你的目的是要保证数据可靠性&#xff0c;RDB 就不太适合了&#xff0c;因为 RDB 持久化不…

Epoch、批量大小、迭代次数

梯度下降 它是 机器学习中使用的迭代 优化算法&#xff0c;用于找到最佳结果&#xff08;曲线的最小值&#xff09;。 坡度 是指 斜坡的倾斜度或倾斜度 梯度下降有一个称为 学习率的参数。 正如您在上图&#xff08;左&#xff09;中看到的&#xff0c;最初步长较大&#…

2023年中国半导体缺陷检测设备市场规模及发展趋势分析[图]

前道检测设备帮助晶圆厂在更快时间内提升芯片良率&#xff0c;按功能可分为参数量测、缺陷检测。前道检测设备按功能可分为参数量测、缺陷检测。 半导体缺陷检测设备分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 2023-2029年中国半导体缺陷检测设备行…

libcurl库使用

libcurl介绍 libcurl是一个跨平台的网络协议库&#xff0c;支持http, https,ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权&#xff0c;HTTP POST,HTTP PUT, FTP 上传, HTTP基本表单上传&#xff0c;代理&#xff0c;cookies和用户认证。 基本…

linux加密和安全

sudo实现授权 添加 vim /etc/sudoers luo ALL(root) /usr/bin/mount /deb/cdrom /mnt/ 切换luo用户使用 sudo mount /dev/cdrom /mnt %sudo ALL(ALL:ALL) ALL %sudo 表示该规则适用于sudo用户组中的所有成员。 ALL(ALL:ALL) 表示可以在任何主机上&#xff0c;以任何用户身份来…

2023.10.17 关于 wait 和 notify 的使用

目录 引言 方法的使用 引入实例&#xff08;wait 不带参数版本&#xff09; wait 方法执行流程 wait 和 notify 组合实例 wait 带参数版本 notify 和 notifyAll 的区别 经典例题 总结 引言 线程最大的问题是抢占式执行&#xff0c;随机调度虽然线程在内核里的调度是随…

UITesting 界面测试

1. 创建界面测试视图 UITestingBootcampView.swift import SwiftUI/// 界面测试 ViewModel class UITestingBootcampViewModel: ObservableObject{let placeholderText: String "Add name here..."Published var textFiledText: String ""Published var…

CVE-2021-26084 漏洞分析

基础知识 Velocity .vm 结尾的文件一般为Velocity模板文件$action $action 是 velocity 上下⽂中的⼀个变量&#xff0c;⼀般在进⾏模板渲染前会设置到 context ⾥⾯。$action 是当前访问路由对应的具体 Action 类。$action.xxx 表⽰取对应 Action 类的 xxx 属性值 ${} 和 $!…

Kotlin中的字符串基本操作

字符串定义&#xff1a; val str: String "Hello World"val str1 "Hello World"获取字符串的长度&#xff1a; println(str.length)通过索引方式访问某个字符&#xff0c;索引从0开始&#xff1a; println(str[4])通过for循环迭代字符串&#xff1a; for…