一、缘起
- 虽一直有学好 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 学习笔记 虽然有点冗长,但可以看看