找回密码
 注册
关于网站域名变更的通知
查看: 339|回复: 1
打印 上一主题 下一主题

迅为4412开发板实验_Makefile编译(上)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-10 13:28 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本章导读- Y- t& J& `' p* _+ h. h7 Z. g
在前面入门视频第十期“搭建编译环境 uboot_linux_Android”中,只介绍了输入 Make命令就可以编译出内核,并没有介绍它是如何运行的。
3 H/ c. A8 \5 Q( C. D, l# _1 u  m在向内核中添加驱动的时候要完成 3 项工作,包括:8 D! l9 \0 k3 s; X6 I" R
1)在 Kconfig 中添加新代码对应项目的编译条件,这一部分在实验 3 已经介绍过;, W4 H8 R% m# V# s" l
2)将驱动源码添加到对应的目录中,这一步比较好理解,在本章实验中将给大家演示一下;4 l$ V/ B! h# H
3)在目录 Makefile 中文件中增加针对新代码的编译条目,这一部分将在本章节介绍到。
  \# v4 q2 G. Q/ a4.1.1 工具
+ G3 m  P0 ~8 G9 H& ]4.1.1.1 硬件工具
6 n5 r2 H* Q6 u# w1)PC 机# P# `- |' L+ y3 G
4.1.1.2 软件工具
* t8 H" Y; D7 d3 P) C1 @8 k1)虚拟机 Vmware8 t2 j* W; H4 {6 C6 b2 Z
2)Ubuntu12.04.2
) x- \' V& y* {# g, o# u: I2 A, Z3 N3)Ubuntu 系统下解压生成的 Linux 源码- u3 F- ~+ S5 f, z0 y1 g) m3 x: e2 C
4.1.2 预备课程/ @- U2 p+ r5 b1 q- E& M
入门视频“01-烧写、编译以及基础知识视频”
4 q6 b# U9 A* }- ^% d→“实验 10-搭建编译环境 uboot_linux_Android”或者使用手册“五 Android 开
" t" R  v2 V! w8 u发环境搭建以及编译”;- ]6 P1 b) M, s6 r* O, f
实验三 Menuconfig_Kconfig
0 O5 q  g/ h. k! M1 o% F2 T4.1.3 视频资源$ k8 W# E& o# K/ ?7 I& y
本节配套视频为“视频 04_Makefile 编译”: q/ G% D! c$ e' L+ t0 C
4.2 学习目标
% R4 B1 i$ Z6 b8 ]本章需要学习以下内容:
+ n( v; J: F8 G/ a& i( x掌握 Linux 内核编译命令5 _  ^# _1 q4 z
掌握编译器路径设置的方法8 I! y. ~6 e8 T: r# w) u2 V3 R
理解环境变量路径、编译器、源码 Makefile 文件中编译器路径三者之间的关系8 h1 U' h/ u! i8 V5 x$ q8 \+ v
理解 Makefile 文件结构
5 x* K: C: {! Z: W掌握向 Makefile 文件中添加脚本命令的方法,能够看懂 Makefile 脚本* Z; u5 P6 P) U4 Z
4.3 编译器路径的设置
8 [$ C$ M/ p4 `8 z! G3 x+ |3 W在前面入门知识中,只介绍了在什么目录解压编译器,在环境变量文件中添加路径,就可以编译出内核,并没有介绍他们之间是如何对应的。: P& k5 L) L. }8 k1 R: U0 E
如下图所示,按照前面提供的基础教程,配置好 Ubuntu 中的编译器和库文件,输入命令“#make”,就可以编译生成内核的二进制镜像。
0 C* o! L" H* H! M% _) t0 E  g4 v/ E3 V/ L
如下图所示,使用命令“#cd”,使用命令“#vim .bashrc”打开环境变量文件“.bashrc”。% d) ]7 |# [' C! o; u- `" C

; p! Z# Q, m! b* c如下图所示,进入最底行,可以看到,在环境变量文件中编译器路径设置为“exportPATH=$PATH:/usr/local/ARM/arm-2009q3/bin”。) Y- Z" D9 @  r2 m. }6 r
, Z/ }% m/ W4 B3 i+ j$ M
然后使用命令“#cd /usr/local/arm/”,进入解压编译器“arm-2009q3.tar.bz2”的文件目录。* Q/ N  @" u& Q* Z
8 g) W3 m+ v$ ^5 h% k
可以明显的看到,环境变量中设置的路径和解压的路径是对应的。
" L1 z; u: E: P8 X  U0 D- F7 }这里回到内核源码的目录,如下图所示。' v8 J4 U" V; c
$ {, G- o' J  }
如下图所示,使用命令“#vim Makefile”打开内核目录下的 Makefile 文件。9 B- a2 n$ A9 G4 S& P

3 Q' c& U2 m1 f0 F; U这里通过 vim 编辑器查找参数“CROSS_COMPILE”,如下图所示。+ }9 j1 f- C; b
  w. n5 d, N3 t" o# k: w
可以查到参数“CROSS_COMPILE”,如下图所示。, w6 M! z$ K: B! c. W& R' [6 N

  {! y; }$ Z9 T2 {- ?7 _% q8 z如上图所示,可以看到这个参数是“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”。" k% H0 n: X/ N" c& i) I
再看一下参数“CROSS_COMPILE”的下一行,可以看出这里有修改过的痕迹。很容易推断出,原来三星是用的“4.5.1”版本的编译器,不过这个没关系,只要能编译通过就可以了。
  {1 R* c/ y/ I: t' w8 q一般说来,拿到源码之后的第一步,是要先要先将源码编译通过。3 d$ }3 g0 o- Q) ?
设置上图中的变量“CROSS_COMPILE”以及环境变量还有编译器实际解压路径三者对应。这三者对应之后,就能确保执行 Make 命令之后,系统能够找到这个编译器。
: q) u1 w6 }& ]. {# B% @8 U在编译命令执行的过程中,会提示一些错误,然后根据提示的错误,挨个去排查修改,去添加库文件或者修改库文件。这个过程有长有短,考验的只是耐心,并没有太多技巧。由于已经将缺少的库文件写成脚本,这样大家在编译器执行以下脚本就能够编译通过。
; V! |# H$ \1 }# @针对内核目录下的 Makefile 文件,提醒大家一下,这个文件中内容很多,除了上面编译器路径变量以外的其它部分几乎不用关注。2 r7 U9 r% l6 F% j3 c
另外还有一个地方需要了解一下,如下图所示,在该文件的第一行,可以看到内核的版本。% B7 d" i) v2 P; t  m

9 Q5 s( {' }, i' H# J4 u4 Z6 `4.4 Make 内核编译命令执行过程简介
$ m0 j* ]2 Z# V: J7 p% Z+ S; B6 Z. W如下图所示,编译内核需要执行 make 命令,在执行 make 命令之后,并没有介绍它是如何执行的。
+ D8 b. s! h2 ?" q( l# ~) i0 n
, T* E* C/ M2 K- o1 K$ t0 p在 make 命令执行之后,它会首先找到当前目录下的“Makefile”文件,如下图所示。
) P; S: M* F# W3 B- e- y' V9 W' O  N4 D. L5 ?* X4 |
运行 Makefile 文件之后,它会在 Makefile 文件中找到编译器的路径“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”如下图所示。
5 w# d& `6 e7 W! J: m% U( I. e5 N  S. z. I
然后系统根据环境变量找到“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”编译器的路径,如下图所示。
4 ^3 D% c! h* a1 H% L( ?' S$ E! B1 `
如下图所示,使用命令“ls /usr/local/arm/arm-2009q3/bin/”可以查看到 arm2009q3解压之后有哪些具体编译器。
0 T, P* w7 U- n- S
+ o% s. G4 h1 n- f如上图,系统找到编译器之后,同时基础的库文件也是和编译器在一起的,有时候编译一个新的内核,还有可能需要修改库文件。
, e- t, H8 D, N* q$ z编译执行前还需要找到“.config”文件,默认是放在源码目录下的。使用命令“ls -a”就可以看到,如下图所示。8 A7 B: a8 l7 e) C
; t, s+ S) R' x! Y; _9 v3 G
从本章‘实验 03’的 3.5 小节,学习到这个“.config”是通过 menuconfig 工具生成的,里面只是一些宏定义,如下图所示,打开这个文件。) E# y' v) `2 F5 t. B/ t3 i+ y% m
( w4 p: w' S. |: c0 \* ^0 U1 W
查找宏定义”LEDS,”是编译 led 驱动的宏定义“LEDS_CTL”,如下图所示。; a1 Q, [& \/ N( E% n1 @

, v$ ~3 ~, V  f现在系统找到这个宏定义“LEDS_CTL”,在编译具体中间文件的时候会用到。* C0 U4 Z( V. v+ t; _" J
具体是怎么实现的,继续看下一小节的内容就可以搞清楚这个宏定义有什么用处。9 Z) K2 Q& I' e) o8 G6 {% T
3 z+ W7 }5 D! t
  • TA的每日心情
    慵懒
    2020-8-28 15:16
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    2#
    发表于 2020-12-14 09:45 | 只看该作者
    拿到源码之后的第一步,是要先要先将源码编译通过
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 22:31 , Processed in 0.156250 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表