Makefile&Shell

本文探讨了Makefile与Shell脚本之间的不同之处。Makefile具有更好的移植性、依赖管理和多线程支持,适用于构建工程项目的场景。而Shell脚本尽管灵活但存在依赖性和一致性的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:qin meng
链接:https://www.zhihu.com/question/22697903/answer/36611257
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

GNU的Make和脚本不是一个东西,虽然看着很像其实完全不是一码事。为什么选择makefile,个人觉得有以下几点:
1、首先,Shell有好多种, Bash、ash、csh等等,甚至dos command,虽然看起来类似,但实际上语法细微差别很多,写通用的shell脚本其实是很有挑战的。如果用shell来写工程的build文件,不是不可以,但是移植性会很差。

2、Shell虽然灵活,但是实际上更多的依赖于系统中其他的命令,比如sed、awk、grep、echo等等。shell更像是功能合集,灵活的同时难题也很多,你没办法保证这些工具在所有平台上的行为都是一致的。

3、make的思路其实跟shell完全不同,Makefile更像是宏替换文法语言,精妙之处在于处理各种文件和串的方式都是字符串的替换过程,这个过程不是”顺序执行的“,而是发生在编译之前,在执行过程则完全依赖于shell,跟脚本无任何区别。shell脚本始终是执行的,对于处理串的来说相比之下要逊色很多,而且重度依赖于sed和awk等等。

4、make另外一个好处就是编译的依赖,可以说make就是为了解决这个问题而生的,shell也不是不能解决这个问题,但是相比之下要麻烦的多,想想用脚本处理文件的时间和内部头文件的依赖关系是个多么烦人的工作吧。

5、现在的GNU make都是支持多线程的,多并发、依赖关系良好的makefile会大幅度压缩项目构建的时间,多线程的脚本也不是不行,不过这就难得多了,用文件锁保证某个目录不能被同时编译这种事对于你的脚本来说有时候是必须的。实际上这同并行编程需要注意的事情一样多,而make只需要一个-j,那你为什么自找麻烦呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值