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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本章导读
9 D& ?: ]; H7 V4 ^! q" N8 y- a在前面入门视频第十期“搭建编译环境 uboot_linux_Android”中,只介绍了输入 Make命令就可以编译出内核,并没有介绍它是如何运行的。
6 z0 `* G5 H$ O: J; C在向内核中添加驱动的时候要完成 3 项工作,包括:0 e6 I& m* y  p6 Y0 c& n
1)在 Kconfig 中添加新代码对应项目的编译条件,这一部分在实验 3 已经介绍过;
' c) C) ~& e& f* d0 X6 O2)将驱动源码添加到对应的目录中,这一步比较好理解,在本章实验中将给大家演示一下;
! q) W5 x4 d5 ]4 Y3 r( F3)在目录 Makefile 中文件中增加针对新代码的编译条目,这一部分将在本章节介绍到。
6 [' O- {* N; m; k4 y  T# _4.1.1 工具
& }* |3 e/ j, R: Y7 V( L; a8 k4.1.1.1 硬件工具
8 U' U% p9 E3 y0 d7 ]- N* W9 H1)PC 机
/ J' s1 u# e- s! u4.1.1.2 软件工具
% F" k9 c3 m2 F- r1)虚拟机 Vmware5 V, _2 h  X, G6 M& L: C9 z
2)Ubuntu12.04.2
/ F0 J- n0 `1 K  \$ |) p( Y9 q3)Ubuntu 系统下解压生成的 Linux 源码5 f( H0 e# @1 _7 Q: i
4.1.2 预备课程
1 {' ]4 R: w4 v2 u  k入门视频“01-烧写、编译以及基础知识视频”: K9 [8 A! ?" y* J
→“实验 10-搭建编译环境 uboot_linux_Android”或者使用手册“五 Android 开
4 s4 a$ `9 r! i3 z0 ]发环境搭建以及编译”;) i, u: {7 G; f
实验三 Menuconfig_Kconfig
! G7 k' v( L) _6 w& E4.1.3 视频资源/ k( a; F& _: ]0 ]/ M/ Y% c8 c
本节配套视频为“视频 04_Makefile 编译”9 j9 T* Y- Y3 o1 L
4.2 学习目标; f6 o3 }: |! X4 B9 S" r& d
本章需要学习以下内容:  c4 u  B3 I/ e9 X$ `" K
掌握 Linux 内核编译命令3 ^3 n) p8 z% p+ G
掌握编译器路径设置的方法( f/ _  S( F- w- d" S
理解环境变量路径、编译器、源码 Makefile 文件中编译器路径三者之间的关系7 J9 m! C/ H6 n  D% E: v
理解 Makefile 文件结构& M9 L- a0 F% M6 t
掌握向 Makefile 文件中添加脚本命令的方法,能够看懂 Makefile 脚本
- J: r& o; M% c4.3 编译器路径的设置
, R7 ]# D' @( {3 G! X% T- [在前面入门知识中,只介绍了在什么目录解压编译器,在环境变量文件中添加路径,就可以编译出内核,并没有介绍他们之间是如何对应的。& p6 p1 Z7 @2 f2 @5 [% S+ s
如下图所示,按照前面提供的基础教程,配置好 Ubuntu 中的编译器和库文件,输入命令“#make”,就可以编译生成内核的二进制镜像。! q. d9 X) {- ^3 C+ K
( }5 @; i2 ?9 @7 k& ]1 a
如下图所示,使用命令“#cd”,使用命令“#vim .bashrc”打开环境变量文件“.bashrc”。
, j/ ?1 J6 b7 E9 D) w& C- I. I9 b2 B* E) a* \. i( ^& y0 P. O
如下图所示,进入最底行,可以看到,在环境变量文件中编译器路径设置为“exportPATH=$PATH:/usr/local/ARM/arm-2009q3/bin”。+ e% o" ^8 U# J2 H  J. J

! S2 Q) \8 H6 k  q9 h' n' Q然后使用命令“#cd /usr/local/arm/”,进入解压编译器“arm-2009q3.tar.bz2”的文件目录。
# [$ E& ?# o1 h0 X2 C
" }; L3 G) ?# i可以明显的看到,环境变量中设置的路径和解压的路径是对应的。, h7 C+ w$ B) z9 S0 @6 _4 y
这里回到内核源码的目录,如下图所示。8 t5 U" x+ Q9 j# u

0 e' ^2 v% u" r/ T% e如下图所示,使用命令“#vim Makefile”打开内核目录下的 Makefile 文件。+ u4 J& t3 b1 X- {5 X* y, a: A/ j
, H/ v, X- {- n- v( m; _4 F# V% w
这里通过 vim 编辑器查找参数“CROSS_COMPILE”,如下图所示。
2 n: X) i6 O1 p" R: ~1 a) o# L! e( B  H! k9 u/ [
可以查到参数“CROSS_COMPILE”,如下图所示。( a9 n- N- V& `+ H5 k8 a5 H+ i) R4 n
  }; R( ]6 Y& @% d# N2 z5 S- t4 h
如上图所示,可以看到这个参数是“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”。5 T4 k$ |( r, I& Y) o
再看一下参数“CROSS_COMPILE”的下一行,可以看出这里有修改过的痕迹。很容易推断出,原来三星是用的“4.5.1”版本的编译器,不过这个没关系,只要能编译通过就可以了。. E' n# {, `5 C6 ?5 U+ X
一般说来,拿到源码之后的第一步,是要先要先将源码编译通过。
2 Z1 ]4 ~* D- g3 C7 _0 ?设置上图中的变量“CROSS_COMPILE”以及环境变量还有编译器实际解压路径三者对应。这三者对应之后,就能确保执行 Make 命令之后,系统能够找到这个编译器。) b; l! E5 b* c6 K8 w' s( Q& G
在编译命令执行的过程中,会提示一些错误,然后根据提示的错误,挨个去排查修改,去添加库文件或者修改库文件。这个过程有长有短,考验的只是耐心,并没有太多技巧。由于已经将缺少的库文件写成脚本,这样大家在编译器执行以下脚本就能够编译通过。
6 `  [# _# K, o, A- k针对内核目录下的 Makefile 文件,提醒大家一下,这个文件中内容很多,除了上面编译器路径变量以外的其它部分几乎不用关注。5 b3 r) S4 W& o) ]
另外还有一个地方需要了解一下,如下图所示,在该文件的第一行,可以看到内核的版本。) M; }5 p) B0 O5 {

6 V* W8 {- y# d; N, }. @' X% |4.4 Make 内核编译命令执行过程简介4 U+ u; [' S( j4 k" \- n6 d8 e8 f
如下图所示,编译内核需要执行 make 命令,在执行 make 命令之后,并没有介绍它是如何执行的。
: o! [. F' }( N/ Z
; C  y& J1 C, r# n/ N' [: [在 make 命令执行之后,它会首先找到当前目录下的“Makefile”文件,如下图所示。
) R- z  _& Y, D. a3 @' `, p: }  H. c; \
运行 Makefile 文件之后,它会在 Makefile 文件中找到编译器的路径“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”如下图所示。
6 B5 v/ V, r4 D  m
" [  }! ?4 `8 z# t: t- a7 i# }. x然后系统根据环境变量找到“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”编译器的路径,如下图所示。
2 y) o+ [4 o! }% @  s
8 R. l5 T3 m9 h) Y如下图所示,使用命令“ls /usr/local/arm/arm-2009q3/bin/”可以查看到 arm2009q3解压之后有哪些具体编译器。
& @) L; m% R9 Y' v8 O; E/ Z$ B
6 P1 [, ~& u2 g, L0 F4 W/ z如上图,系统找到编译器之后,同时基础的库文件也是和编译器在一起的,有时候编译一个新的内核,还有可能需要修改库文件。. Z0 U% c: T) |. N& m/ `
编译执行前还需要找到“.config”文件,默认是放在源码目录下的。使用命令“ls -a”就可以看到,如下图所示。
' N$ _% Q; J1 n2 o0 Y8 ~+ L
; g2 v: e( L: k4 _从本章‘实验 03’的 3.5 小节,学习到这个“.config”是通过 menuconfig 工具生成的,里面只是一些宏定义,如下图所示,打开这个文件。
4 x. s8 n* Y; G7 o2 l7 Y
' |/ w/ ^) K3 |9 J查找宏定义”LEDS,”是编译 led 驱动的宏定义“LEDS_CTL”,如下图所示。
* {! E% t# V+ [6 V! B& m$ h
& T9 g# |0 F- W. m0 x, m现在系统找到这个宏定义“LEDS_CTL”,在编译具体中间文件的时候会用到。5 P5 N0 D6 b" U1 v
具体是怎么实现的,继续看下一小节的内容就可以搞清楚这个宏定义有什么用处。9 N! d& u/ b- J  A6 a& M8 K  K
' ]: B2 p& N5 d
  • 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 19:18 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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