一、缘起
- 虽一直有学好makefile的发心,但并没有啥学习场景,看书吧又没找到合适的教材,这就尴尬了,好在除了面试问一嘴,其它场景上也没太用上。
-
最近手上有两个单子,是跟make相关的,于是借着这一波,把知识串了一下。
- 1、代码加编译开关,makeall的脚本里加编译参数
- 2、新增了一个文件夹,编译没报错,生成.o文件了,没有生成执行文件
二、内容
1、项目前提
-
用makeall的脚本来管理整个项目,这部分呢没完全懂呢
-
Makefile.incl
里写了通用的配置,比如平台,编译和链接方式 - 各个具体的文件夹内写了相应的
Makefile
,这个就比较简单好懂了,调用Makefile.incl后,然后列一些具体规则,clean,all,build,install
这些,当然还有一些变量。
-
2、没有生成exe的解决
-
开始是完全没有思路的。最开始时甚至是不知道可以用
make
+规则名。{测试问的我,我就先看了看}- 最开始以为是
-I -l
指定的zookeeper的include不对呢 - 后来在具体文件夹下执行了下
make build
竟然能生成了,当时能生成,但不知道原因。
- 最开始以为是
- 知道问题后,想知道下在哪加入
make build
,就问了厂内大佬,需要在makeall
的脚本里增加。
3、《GNU Make项目管理(3rd)》get到,1st
- 3.1、Makefile是由规则组成的,规则本身分成3个部分(target,prerequisite,command),而规则又分为3种类型(explict,pattern,implict)
- 3.2、通过
make ruleName
执行相应的规则,make也是可以调试的,怎么调还不太会。 - 3.3、除了自已定义的变量外(这都比较好懂),还有自动变量,比如
$@、$%、$<、$?、$^
等,必须要知道这些是啥意思,否则脚本看不懂。 - 3.4、虽然书中”chap4讲了函数“,但工程里我没看到相应的。
- 3.5、command虽然有默认的shell(
/bin/sh
),但也有可以指定(虽然没啥必要),用tab
来区分。 - 3.6、虽然看到了
Makefile.incl
里有ar
命令,但不同的平台,好像又不太一样,这个具体啥意思,还不太熟悉。 - 3.7、书中"chap12makefile调试",看了一些常见的错误信息,但具体怎么调还没怎么看呢。
4、学习方法和心得
-
4.1、找到合适的入门教材不容易,尤其在水平有点差,云里雾里的时候,最好有个实践环境,比如下个源代码,然后用命令编译,有感觉后再看书。
- 自已改改原来好的Makefile,再跑
make build
啥的,看报啥错
- 自已改改原来好的Makefile,再跑
- 4.2、如果项目中用的是Makefile,以项目为蓝本,把整个给吃透,通过查不会的关键字,再结合看书,把项目上的目前的Makefile吃透搞懂,再谈其它。
三、履历与参考书籍
1、履历
- 20190809写第1版,读了“参考1”的Part1和Part2的chap11,12,目标是入门以及读懂工程中的make相关代码,以后能直接改错。后面的用iReader smart再看看书吧
2、参考书籍
- 参考1:《GNU Make项目管理(第三版)》 2006的书 主力,GNU3.80
- 参考2:跟我一起写Makefile.pdf 偶尔看
- 参考3:GNU Make Manual updated 2016 其实没看呢
3、其它
- GenericMakefile
- Makefile学习笔记 虽然有点冗长,但可以看看
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。