Makefile 是 Linux 系统中一种常用的文件格式,它可以用来描述程序的编译过程和依赖关系,让用户可以方便地使用 make 命令来构建和管理程序。Makefile 的优点是简单、灵活、可移植,但是也有一些缺点,如编译速度慢、资源消耗大、重复编译多等。那么,如何在 Linux 下优化 Makefile 的性能,提高编译速度和效率呢?本文将为你介绍 Linux Makefile 的一些性能优化方法,如使用并行编译、增量编译、预编译头文件、缓存编译结果等,让你在 Linux 下更好地使用和编写 Makefile。
1. 赋值运算符的影响
‘:=’ 和 ‘=’ 两个赋值运算符是如何影响编译速度的呢?这其中的奥妙就在于它们的本质含义,若是理解透彻了也就不会心存疑惑了,博主也是苦思了很久,并且搜索了很多网络资料,最后被该篇博文一语惊醒!请点击此处查看该博文
-
= 赋值运算符 – 递归展开式 – 延后展开
“=”表示将整个 Makefile 展开后,再决定变量的值,即变量的值将会是整个Makefile中最后被递归展开所指定的值,而不管其引用的中间变量是在执行目标规则之前还是之后。
示例如下:
foo = $(bar)
bar = $(ugh)
ugh = $(Huh)
all:
@echo $(foo)
Huh = AfterTarget
make之后其结果为 : AfterTarget
其整个执行过程如下:
首先“$(foo)”被替换为“$(bar)”,
接下来 “$(bar)”被替换为“$(ugh)”,
“$(ugh)”被替换为“$(Huh)”,
最后$(Huh)被替换为“AfterTarget”。
整个替换的过程是在执行“echo $(foo)”是进行的。
注意一句话:整个替换的过程是在执行“echo $(foo)”时进行的。
-
:=赋值运算符 – 直接展开式 – 立即展开
“:=”表示变量的值决定于它在 Makefile 中的位置,而不是整个 Makefile 展开后的最终值。在使用该赋值运算符来定义变量时,变量值中对另外变量的引用或者函数的引用在定义时就被展开了,即定义时变量就已经是其表达式最终的值了。
示例如下:
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
以上是这两个赋值运算符基本的说明,下面详细描述其是怎么影响编译速度的!
示例如下:
TmpDir = /Source #此处随意定义了一个目录,
#但切记在实际编写的 Makefile 中,不要在赋值语句后面写注释,
#否则会把 /Source 到 # 之间的空格也算进去的。
#在下面引用该变量的时候实际上‘/Source_’最后还多了一个空格
#为了表示清楚,我用下划线表示空格,这样的目录肯定是不存在的
#以下语句调用了Shell函数,其结果是把指定目录下的所有源文件赋值给 x 变量,
#两者取其一运行make
#x := $(shell cd $(TmpDir); ls *.c)
x = $(shell cd $(TmpDir); ls *.c)
all:
@echo $(x)
@echo $(x)
@echo $(x)
-
:= 是立即变量赋值,在定义时值已经被确定。执行 make 时, x 的值已经是指定目录下的所有源文件了,所以尽管后面执行了三次 @echo $(x) ,但其实 Shell函数只调用了一次 -
= 是延时变量赋值,只有在这个变量被使用时才展开。执行 make 时, x 定义时其值并没有展开,所以后面执行了三次 @echo $(x) ,每次都调用了 Shell 函数,最终调用了三次 Shell 函数
通过以上分析过程,对于这两个运算符是如何影响编译速度的疑惑应该心里有底了。
通过本文,你应该对 Linux Makefile 的一些性能优化方法有了一个基本的了解,知道了如何提高编译速度和效率,如使用并行编译、增量编译、预编译头文件、缓存编译结果等。你也应该明白了 Makefile 的性能优化的原理和影响,以及如何在 Linux 下正确地使用和配置这些方法。我们建议你在使用 Makefile 时要根据自己的项目和需求,选择合适的性能优化方法,以提高程序的构建质量和速度。同时,我们也提醒你在使用 Makefile 时要注意一些潜在的问题和挑战,如兼容性、稳定性、可维护性等。希望本文能够帮助你更好地使用 Linux 系统,让你在 Linux 下享受 Makefile 的性能优化的好处和便利。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !