乐趣区

Makefile学习之路

一、缘起

  • 虽一直有学好 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 啥的,看报啥错
  • 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 学习笔记 虽然有点冗长,但可以看看
退出移动版