Linux - make/Makefile工具的基础使用

news2024/11/18 10:12:45

文章目录

    • 一、介绍
    • 二、工作原理
    • 三、使用
      • 1、make的使用
      • 2、make的常用选项
      • 3、Makefile文件
    • 四、总结


一、介绍

make工具和 Makefile 文件是 Linux下非常重要的自动化构建工具, Makefile定义了项目的编译规则,指示make如何编译和链接源代码以生成可执行文件或其他输出。并且make 能够根据源文件的时间戳自动判断哪些文件需要重新编译,从而只编译那些需要更新的部分,极大地提高了开发效率。

二、工作原理

  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件, 并把这个文件作为最终的目标文件。
  3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用touch测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
  4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明 make的终极任务,也就是执行文件hello了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。

三、使用

1、make的使用

语法:

make

make会从上到下扫描Makefile文件,直到找到第一个目标名。

make name

name : 目标名
make会从上到下扫描Makefile文件,直到找到name。

2、make的常用选项

make -f filename:使用指定的Makefile文件执行构建。
make -C directory:在指定的目录中执行构建。
make -n:显示执行Makefile时将执行的命令,但不实际执行。
make -B:强制重新构建目标,即使目标已经是最新的。
make -j n:使用多个并行任务进行构建,其中n是并行任务的数量(这里的 n 是你希望并行执行的任务数量,通常设置为 CPU 核心数的 1.5 到 2 倍可以获得较好的效果,但这取决于你的具体系统和构建过程中的 I/O 密集度),可以显著提高构建速度。

对于:name -j n 选项
假如你的项目包含大量的源文件,需要编译成多个目标文件(.o 文件),并最终链接成可执行文件。不使用并行任务时(即只使用单个任务),make 会按顺序编译每个源文件,然后链接它们。这可能需要很长时间,尤其是当源文件数量很多时。然而,使用 make -j 8(假设你希望利用 CPU 和可能的 I/O 超线程,这里 8 是 CPU 核心数的两倍),make 会同时启动 8 个编译任务(或者尽可能多,直到达到 8 个),这样 CPU 就可以被更充分地利用,编译过程也会更快。

all: program  
  
program: file1.o file2.o file3.o  
    gcc file1.o file2.o file3.o -o program  
  
file1.o: file1.c  
    gcc -c file1.c -o file1.o  
  
file2.o: file2.c  
    gcc -c file2.c -o file2.o  
  
file3.o: file3.c  
    gcc -c file3.c -o file3.o  
  
clean:  
    rm -f *.o program

此时make会尝试去同时编译三个.o文件。

3、Makefile文件

(1)基础元素

  1. 规则(Rules):
    目标(Target):规则想要生成的文件名,比如可执行文件或对象文件。
    依赖(Prerequisites):生成目标所依赖的文件列表。如果依赖的文件比目标文件更新,则规则中的命令会被执行。
    命令(Commands):生成目标所需执行的命令,通常是编译器或链接器的调用。
  2. 变量(Variables):用于存储文件名、编译器选项等,以便在多个规则中重用。
  3. 函数(Functions): 用于处理文件名、执行命令等,提供高级功能。
    如: 假设VARIABLE = file.txt 函数$(VARIABLE)用途: 将VARIABLE替换成file.txt
  4. 注释(Comments): 以#开头的行是注释,不会被make执行。

(2)伪目标
概念:

伪目标(也称为“伪目标”或“标签”)是指那些不代表实际文件名(如文件、目录等)的目标。伪目标主要用于执行某些命令或操作,而不是创建或更新文件名所指向的文件。由于伪目标不代表任何文件,因此每次执行make命令时,伪目标都会被视为已过期(即需要重新执行),除非使用了.PHONY声明来显式标记它们为伪目标。

定义伪目标:
伪目标在Makefile中就像普通目标一样被定义,但是通常不会对应到实际的文件。为了明确地将某个目标标记为伪目标,可以使用.PHONY特殊目标来声明它:

.PHONY: clean  
  
clean:  
    rm -f *.o my_program

在这个例子中,clean是一个伪目标,它用于删除所有的.o文件和my_program可执行文件。通过.PHONY: clean声明,make知道clean是一个伪目标,因此每次执行make clean时,都会执行rm -f *.o my_program命令,而不会去检查是否存在一个名为clean的文件来决定是否需要执行该命令。

(3)利用上面的特性写一个Makefile文件
生成一个可执行程序
代码:

  1 te = test.c                                                                                                                                                                                  
  2 t = test
  3 
  4 $(t) : $(te)
  5 #test : test.c
  6   #gcc -o test test.c             
  7   gcc -o $(t) $(te)               
  8                                   
  9 .PHONY: clean                     
 10 clean:                            
 11   #rm -rf test                    
 12   rm -rf $(t)

解析:

在这里插入图片描述
(4)Makefile的一些高级特性

1、自动变量:
$@:表示规则中的目标文件名。
$<:表示规则中的第一个依赖文件名。
$^:表示规则中的所有依赖文件列表。
2、模式规则:
使用通配符定义规则,如%.o: %.c,表示所有.o文件都由对应的.c文件生成(通过对应的.c文件生成同名的.o文件)。
条件判断:
使用ifeq、ifneq、ifdef和ifndef等关键字进行条件编译。

(5)使用一些高级特性写一个Makefile文件
生成:一个可执行程序

  1 target = test
  2 depend = test.o
  3 
  4 $(target) : $(depend)                                                                                                                                                                        
  5   gcc $^ -o $@
  6 
  7 %.o : %.c
  8   gcc -c $<
  9 
 10 .PHONY: clean
 11 clean:                            
 12   rm -rf $(depend)
 13 

在这里插入图片描述

四、总结

上述讲的make/makefile只是一些基础使用,make/makefile还有许多操作与功能,想了解更多可以参考陈皓大佬的跟我一起写Makelile。

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

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

相关文章

[wowoza]使用rtsp协议向wowza推流方法

1、测试前要关闭电脑防火墙 2、测试前要关闭推流验证功能 3、3、关闭回放验证功能 上面设置修改后&#xff0c;要点击restart重启 4、查看服务器ip、端口号、application test player可以预览推流的音视频 有时候需要缓存 url里面注意没有空格

牛客练习赛128(上)

Cidoai的幂次序列 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include <bits/stdc.h> using namespace std; signed main(){long long n,k;cin>>n>>k;cout<<2<<\n;cout<<n-1<< <<1<<\n;return 0; } 代…

D - 1D Country(AtCoder Beginner Contest 371)

题目链接: D - 1D Country (atcoder.jp) 题目描述: 数据范围: 输入输出: 题目分析: 典型的l, r 区间问题&#xff0c;即是前缀和问题&#xff0c;但是注意到数据范围, 数据范围1e-9 到 1e9 数据范围&#xff0c;要是从最小到最大直接for循环去模拟的话&#xff0c;时间复杂度…

CMake构建学习笔记16-使用VS进行CMake项目的开发

文章目录 1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行 3. 项目案例4. 总结 1. 概论 在之前的系列博文中&#xff0c;我们学习了如何构建第三方的依赖库&#xff0c;也学习了如何去组建自己的CMake项目&#xff0c;尤其是学习了CMake的核心配…

分享六款小众宝藏软件,建议收藏!

分享6款小众却实用的宝藏电脑软件&#xff0c;个个都有独特的作用&#xff0c;可以提高效率、提升体验感&#xff01; 1.Clover 一个超轻量级的文件夹管理工具&#xff0c;跟 Windows 资源管理器差不多。但用 Clover 感觉就像用 Chrome 来整理文件似的。 它最棒的功能就是能像…

【python计算机视觉编程——10.OpenCV】

python计算机视觉编程——10.OpenCV 10.OpenCV10.2 OpenCV基础知识10.2.1 读取和写入图像10.2.2 颜色空间10.2.3 显示图像及结果 10.3 处理视频10.3.1 视频输入10.3.2 将视频读取到NumPy数组中 10.4 跟踪10.4.1 光流10.4.2 Lucas-Kanade算法使用跟踪器使用发生器 10.5 更多示例…

计算架构模式之负载均衡技巧

通用负载均衡算法 负载均衡算法 -轮询 & 随机 如果服务器挂掉了&#xff0c;那么负载均衡器还是可以感知到的&#xff0c;因为连接已经断掉了。 负载均衡算法-加权轮询 假设你有4核的和8核的&#xff0c;由于你的程序没有办法跑完CPU&#xff0c;那么有可能出现4核的和8核…

xmake vscode+clangd实现c/c++程序更精确跳转、补全

clangd相比与vscode自带的c/c插件要好用很多&#xff0c;使用xmake搭配vscode开发c/c程序时&#xff0c;可以通过下面方法使用clangd。 生成compile_commands.json 好像是叫什么compile database&#xff0c;xmake可以使用下面两种方式生成。 1、手动生成 xmake project -k…

[linux基础知识]教你使用vim和ctags阅读linux内核源码

1 安装ctags apt install ctags 2 内核源码目录下添加索引 使用下面命令&#xff0c;添加索引成功后&#xff0c;内核目录下会生成tags 索引文件。 ctags -R 3 vim使用索引阅读源码 跳转到函数变量定义与返回 #跳到函数或者变量定义 Ctrl] #返回 Ctrlo 光标移动到需要…

九九乘法表-for-python

for i in range(1, 10):for j in range(1, i):print(f"{j}*{i}{i*j}\t", end )print()运行结果截图&#xff1a;

Linux 离线安装 Docker

一、安装 docker 1. 下载 Docker 安装包 https://download.docker.com/linux/static/stable/x86_64/ 2. 解压安装包 tar -xvf docker-27.1.0.tgz mv docker/* /usr/bin/3. 将 docker 注册为 service 服务 vim /etc/systemd/system/docker.servicedocker.service [Unit] Des…

学习笔记 韩顺平 零基础30天学会Java(2024.9.14)

P547 Collections工具类2 P554 泛型引入 P555 泛型入门 ArrayList<Dog>arrayList new ArrayList<Dog>()//在这里可以理解为这个arrayList里面只能放Dog类型&#xff0c;就是限制了类型 P556 泛型说明 泛型就是可以代指一类数据类型&#xff0c;可以是Integer也可以…

哪个虚拟机软件在 Mac 上更好用,Mac 虚拟机会影响性能吗?

虚拟机如今已经成为许多用户工作生活不可缺少的工具之一&#xff0c;尤其是对于需要经常切换使用不同系统的用户来说&#xff0c;虚拟机提供了一个便捷而有效的操作平台&#xff0c;解决用户跨系统工作的问题。然而&#xff0c;当我们考虑在Mac上下载运行虚拟机时&#xff0c;会…

艾体宝洞察丨一文读懂最新密码存储方法,揭秘密码存储常见误区!

在信息安全的诸多领域之中&#xff0c;密码的安全存储无疑已然成为最为核心的问题之一。随着攻击技术的不断演进&#xff0c;传统的密码存储方法已无法抵御现代复杂的威胁。更为安全、健壮的密码存储机制也成为当代信息安全从业者的关注点。本篇文章将引入并介绍密码存储中的基…

交叉编译工具链的安装及带wiringPi库的交叉编译实现

交叉编译工具链的安装及带wiringPi库的交叉编译实现 交叉编译的概念交叉编译工具链的安装下载交叉编译工具链配置环境遍变量编译程序到ARM平台 带wiringPi库的交叉编译下载编译wiringPi库调用树莓派的wringPi库 交叉编译的概念 交叉编译是在一个平台上生成另一个平台上的可执行…

【资料分析】平均倍数类

平均 观察选项&#xff0c;差距较大&#xff0c;大胆约分即可 很少的情况下&#xff0c;选项相差很近不能随便约分 倍数 第N次注意增长率是否为下降&#xff01; 问的是基期倍数比哦 平均增长量 十三五这种明确问法&#xff0c;一定是五年 属于有往前推的A和不往前推的…

智能智造和工业软件研发平台SCSAI功能介绍

用爱编程30年&#xff0c;倾心打造工业和智能智造软件研发平台SCIOT,用创新的方案、大幅的让利和极致的营销&#xff0c;致力于为10000家的中小企业实现数字化转型&#xff0c;打造数字化企业和智能工厂&#xff0c;点击上边蓝色字体&#xff0c;关注“AI智造AI编程”或文末扫码…

掌握Transformer之深入多头注意力机制

01 引言 这是我关于Transformer系列的第三篇文章。在在前两篇文章中&#xff0c;我们了解了什么是Transformer、Transformer的架构以及其各组件的工作原理。在本文中&#xff0c;我们将进一步深入探讨多头注意力机制&#xff0c;它是Transformer的大脑。 闲话少说&#xff0…

每天五分钟玩转深度学习PyTorch:模型参数优化器torch.optim

本文重点 在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化(或最大化),优化算法就是一种调整模型参数更新的策略。在pytorch中定义了优化器optim,我们可以使用它调用封装好的优化算法,然后传递给它神经网络模型参数,就可以对模型进行优化。本文是学习第…

福建聚鼎科技:装饰画怎么运营更受大家喜欢

在繁华喧嚣的都市中&#xff0c;装饰画宛如一首无言的诗篇&#xff0c;静静地诉说着生活的美好。如何让这门艺术走进千家万户&#xff0c;成为装点空间、启迪心灵的一抹亮色?今天&#xff0c;我们就来探寻装饰画运营的秘诀&#xff0c;让它在市场的海洋中乘风破浪。 一幅优秀的…