make工程管理器与Makefile

devtools/2025/1/12 20:04:27/

目录

一、介绍

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.ogcc a.o -o test
a.o:a.cgcc -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?=666test:a.ogcc a.o -o test
a.o:a.cgcc -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.cgcc main1.c -o main1
main2:main2.cgcc main2.c -o main2

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

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


http://www.ppmy.cn/devtools/149964.html

相关文章

Java中的反射机制及其应用场景

目录 什么是Java反射机制&#xff1f; 工作原理 主要应用场景 注意事项 总结 什么是Java反射机制&#xff1f; Java反射机制是一种强大的工具&#xff0c;它允许程序在运行时访问、检查和修改其本身的类和对象的信息。通过反射&#xff0c;开发者可以在不知道类的具体实现…

小米路由器IPv6 功能使用指南

本文不限于多层路由使用IPv6 的情况&#xff0c;提供解决IPv6 无法获取的更硬核的方法&#xff0c;需要有ssh 工具。&#xff08;无安卓设备&#xff0c;测试环境win、mac、ios&#xff09; 首先明确一点&#xff0c;就是如果想让你的设备得到GUA 地址&#xff0c;即访问 6.i…

2025 西电软工数据结构机考 Tip (By Felix)

2025/01/07 18:30-20:30 XDOJ 五道题 三道题即为满分 近两年没有考过图和字符串&#xff0c;链表和树为重点内容&#xff08;必考 重点准备&#xff09; 2024年五道题&#xff1a; 题目内容类型得分未知C语言未参加给出后序和中序遍历建树树未参加堆排序输出过程量排…

安全运维管理 10.2资产管理

等级保护对象的资产包括各种硬件设备&#xff08;如网络设备、安全设备、服务器设备、操作终端、存储设备和存储介质&#xff0c;以及供电和通信用线缆等&#xff09;、各种软件&#xff08;如操作系统、数据库管理系统、应用系统等&#xff09;各种数据&#xff08;如配置数据…

生信算法10 - Levenshtein距离与汉明距离比对序列差异

1. Levenshtein 距离 Levenshtein 距离&#xff0c;也称为编辑距离&#xff0c;是一种衡量两个字符串之间差异的度量方法。它表示将一个字符串转换为另一个字符串所需的最少编辑操作次数&#xff0c;允许的编辑操作包括插入、删除和替换字符。 1.1 Levenshtein 距离的应用&…

[Qt] 多元素控件 | 容器类控件 | 布局管理器layout

目录 一.多元素控件 1、List Widget 【使用 ListWidget】 2、Table Widget 【使用 QTableWidget】 3、Tree Widget 【使用 QTreeWidget】 二、容器类控件 1、Group Box 【给麦当劳案例加上分组框】 2、Tab Widget 【使用标签页管理多组控件】 三、布局管理器 1、…

docker--小白--导入timescaledb

先安装好docker,确保docker 可正常访问&#xff0c;可参考上一篇文章 安装镜像 sudo docker pull timescale/timescaledb:latest-pg13 如果出现以下错误&#xff0c;应该是权限问题 从本地文件加载镜像或容器&#xff0c;timescaledb是从docker中导出来的 cat /home/t606/time…

《解锁数据科学的魔法盒子:JupyterLab 全面解析》

《解锁数据科学的魔法盒子&#xff1a;JupyterLab 全面解析》 一、JupyterLab 是什么&#xff1f;二、JupyterLab 的核心特性&#xff08;一&#xff09;交互模式&#xff1a;即时反馈的代码调试利器&#xff08;二&#xff09;内核支持的文档&#xff1a;多语言代码执行的舞台…