前言

又到了成胖子每周一博的时间了,本周是第三周.
本周我们继续了解openwrt的编译过程,如果还有没写过简单ipk或者编译过openwrt的朋友,可以参见我之前的博客或者网上的其他文章

一 年轻的冲动

为什么我在学习的过程中,有先学习整个编译过程和Makefile的冲动呢?

1.我们知道电脑的运算速度是很快的.即使如此,一个完整的编译过程往往需要好几个小时.这中间到底发生了些什么?屏幕上一闪而过的像天书一样的东西,我怎么才能有所了解?
2. 经历漫长的等待,我们得到了一个镜像bin文件.这里面到底包含了什么东西?我可以知道么?
3. 编译单个ipk的时候,我按照模板写的Makefile怎么和我在书上见的长的不太一样呢?
4. 在单个ipk中,怎么包含头文件,动态库,静态库?怎么解决依赖关系?
5. 在输入make menuconfig之后,又发生了什么?弹出的图形界面中,怎么会有我放在package目录中的源码的信息?
6. 有的时候,编译报错了.提示信息它认识我,我不认识它.我要怎么排查呢?

零零散散的总是有很多疑问困扰着我.我相信有很多刚接触openwrt的朋友都和我有同感.而所有这些都是可以通过完整学习编译过程来解答的.这样想想是不是更有学习的动力了呢?

二 学习曲线

2.1 Makefile基本语法

我们知道编译过程是通过Makefile来控制的.这样而言,Makefile的基本语法就必须有所了解.网上有很多零散的资料往往不成体系.推荐阅读一个是陈皓自己写的和翻译的GNU Make的手册.还是比较全的.英文还凑合的朋友,我推荐还是尽力读读官方的手册,简介精炼,没事学点英文也是好的.后面的文章,假定读者对Makefile有所了解.

2.2 bash基础

Makefile中的执行部分(recipe)是有bash脚本组成的,所以我们同时应当对bash shell有所了解.

2.3 world

有了这两部分的预备知识,我们将开始我们的征途.我们的目标是world.

三 编译过程概述

在学习Makefile之前,我们先对编译的总体过程,有个感性的认识,请看下图:

Created with Raphaël 2.1.0开始1.主机预装工具2.编译host工具3.编译交叉工具链4.编译内核模块5.编译ipk6.安装ipk到文件系统7.编译内核8.将内核和文件系统组合成最终bin文件.结束

3.1 主机预装工具

在编译源码之前,我们必须手动安装一部分工具 .

sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev

这部分是在执行编译工作之前的.

3.2 编译host工具

除了我们在第一步安装的工具,编译过程中还需要其他一些主机工具.这部分工具将首先编译.

3.3 编译交叉工具链

openwrt自带交叉编译链,当然在编译目标平台软件前,需要先编译.

3.4 编译内核模块

因为部分内核模块将会生成独立的ipk,所以内核模块需要首先编译.

3.5 编译ipk

这里将编译package目录下的各个软件包,这也是和我们最为息息相关的.之后的博客将会重点介绍这个部分.

3.6 安装ipk

将生成的ipk安装到文件系统之中(比如build_dir/target-XXX/root-ramips目录).

3.7 编译内核

在完成ipk编译之后,将会编译内核,压缩内核.同时使用mkimage工具,在内核前面生成一个用于uboot识别的头部.

3.8 合成

在最后一步,将squashfs格式的文件系统和内核连接在一起,即生成了目标镜像文件.

尾声

本周到此为止,下一篇我们将介绍根目录下的Makefile,从而知道为什么编译的大致过程是上面提及的八步.

(二)我的Makefile学习冲动&&编译过程概述的更多相关文章

  1. C编译过程概述

    转自:http://my.oschina.net/apeng/blog/105245 C 编译过程概述 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection), ...

  2. [转贴]C编译过程概述

    http://my.oschina.net/apeng/blog/105245 C 编译过程概述 目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是G ...

  3. go语言编译过程概述

    go语言编译过程概述 总结自<go语言设计与实现> 名词解释: 中间代码 中间代码是编译器或者虚拟机使用的语言,它可以来帮助我们分析计算机程序.在编译过程中,编译器会在将源代码转换到机器码 ...

  4. Linux学习---GCC编译过程

    (一)GCC编译过程 预处理 cpp -o a.i a.c     //生成预处理文件 等同于[gcc -E] //预处理为将宏定义(#define)等进行替换. 编译 /user/lib/gcc/i ...

  5. C++编译过程概述

    一 ---导读 想象成工厂要产出一个产品的过程,经过流水线上一步一步,不同的人的操作,然后经过整合,就得到了一个完整可用的产品. 二---编译过程图解 三---在linux中编程详解编译过程 当我们在 ...

  6. 【转载】C编译过程概述

    gcc:http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html#_Toc311642844 gdb:http://www.cn ...

  7. Linux系统GCC常用命令和GCC编译过程描述

    前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言.GCC 很快地扩展,变得可处理 C++.后来又 扩展能够支持更多编程语言,如Fortran. ...

  8. Go 语言编译过程

    走进Golang之编译器原理_大愚Talk-CSDN博客 https://blog.csdn.net/hel12he/article/details/103061921 go编译器 - 知乎 http ...

  9. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

随机推荐

  1. 译:c#生成条码的web控件

    译文:http://www.codeproject.com/Tips/846860/Csharp-Barcode-Generator-Web-Control 在asp.net的web页用c#的web控 ...

  2. HTML5 语义元素

    返回目录 http://hovertree.com/h/bjaf/html5zixueji.htm 一个语义元素能够清楚的描述其意义给浏览器和开发者.无语义 元素实例: <div> 和 & ...

  3. [CLR via C#]21. 自动内存管理(垃圾回收机制)

    目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象 ...

  4. (转载)IO-同步、异步、阻塞、非阻塞

    一.概述 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不 ...

  5. Python入门笔记(19):Python函数(2):函数/方法装饰器

    一.装饰器(decorators) 装饰器的语法以@开头,接着是装饰器函数的名字.可选参数. 紧跟装饰器声明的是被装饰的函数和被装饰的函数的可选参数,如下: @decorator(dec_opt_ar ...

  6. 创建一个弹出DIV窗口

    创建一个弹出DIV窗口 摘自:   http://www.cnblogs.com/TivonStone/archive/2012/03/20/2407919.html 创建一个弹出DIV窗口可能是现在 ...

  7. 【Unity】12.5 Navmesh Obstacle组件

    开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 在大多数游戏情景中,可行进的区域往往不是完全不变的.比如被破坏的路.桥等将不再允许通过.那么, ...

  8. 解决SlidingMenu和SwipeBackLayout右滑事件冲突问题

    SwipeBackLayout向右滑动关闭当前Activity,SlidingMenu向右滑动则是打开menu部分.在同一个Activity中,当SlidingMenu处于打开状态时,此时向右滑动,事 ...

  9. Linux下的crontab命令使用特别须注意的地方

    1.如果命令中涉及到了年月日(如:date +%C%y%m%d),其中%必须进行转义,如下: date +\%C\%y\%m\%d 2.使用到的命令必须使用完整的路径: * * * /home/yxf ...

  10. AutoMapper映射ExpressionTree

    问题描述 项目中使用AutoMapper进行VO&DTO&Entity的互相映射,但是默认Map方法不支持Expression的转换.如 Expression<Func<E ...