OK335XD交叉编译器制作


OK335XD交叉编译器制作

  • 硬件平台
  • 官方下载buildroot交叉编译工具
  • 制作方法
  • 碰到的问题

硬件平台

CPU:TI AM3354 Cortex-A8处理器
架构:ARMv7 Cortex-A8
主频:800MHz (最高1G)
内存:512M DDR3 (属于SDRAM)
ROM:1G SLC NandFlash
开发板是飞凌的OK335XD

官方下载buildroot交叉编译工具

buildroot官网:https://buildroot.org/
官网旧版本下载:https://buildroot.org/downloads/

根据自己对于交叉编译器版本的需求,下载对应的buildroot版本。
注意:buildroot版本过低的或者过高的话,里面选择交叉编译器gcc版本可能过低或过高,例如我想用gcc4.8的版本,但是我用buildroot是2019版本,所以交叉编译器gcc版本和buildroot版本的对应关系,其实还是考经验进行选择,不然一方面会出现意想不到的错误,另一方面gcc版本也不是自己想要的。
在这里插入图片描述

前辈嘱咐: 制作交叉编译器别用ROOT制作, 否则会出现很多莫名其妙的错误!!!

制作方法

首先选择存放路径, 我选择存放在 /opt/ 路径下, 因为不能使用root干活,所以需要给相关权限, 使用一下命令相应授权。

1
sudo chmod 777 /opt/

直接在该路径下,通过下面命令直接下载对应的buildroot版本即可:

1
wget https://buildroot.org/downloads/buildroot-2019.02.8.tar.gz

解压完成,直接进入目录中,输入如下命令进行图形化界面的配置:

1
make menuconfig

在这里插入图片描述
直接进入图形化界面进行配置:
在这里插入图片描述
可能出现的错误:
make menuconfig 出现的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
ygu@stb-lab-04:/opt/linux/3.14-1.14/rootfs$ make menuconfig-linux
make -C linux ARCH=arm menuconfig
make[1]: Entering directory `/opt/linux/3.14-1.14/linux'
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
 *** Install ncurses (ncurses-devel) and try again.
***
make[2]: *** [scripts/kconfig/dochecklxdialog] Error 1
make[1]: *** [menuconfig] Error 2
make[1]: Leaving directory `/opt/linux/3.14-1.14/linux'
make: *** [menuconfig-linux] Error 2

解决方法:
Linux几乎每个发行版都会有’ncurses’及’ncurses-devel’的安装包的,再根据上面第二条命令错误提示,“现在没有可用的软件包 ncurses,但是它被其它的软件包引用了。” 可以判定Ubuntu软件管理器服务端有作修改过。所以到 Ubuntu Package archive(http://packages.ubuntu.com/)搜索是否存在该安装包,用’ncurses-devel’作为关键字搜索,没有任何结果。搜索’ncurses’出现了很多返回结果。根据每个返回搜索结果的说明可以发现在Ubuntu中’ncurses-devel’是以’libncurses5-dev’命名的。

1
sudo apt-get install libncurses5-dev

安装完成之后,再进行make menuconfig,就可以正常进入内核配置了。

Target options 选项配置
在这里插入图片描述
根据自己的硬件平台,进行选择相应的模块
在这里插入图片描述

Build options 选项配置

这里只更改一个选项

在这里插入图片描述
在这里插入图片描述
如果不明白意思,可以通过键盘上下左右按钮,进行选择help帮助按钮,里面有它配置的详细解释。
在这里插入图片描述
Toolchain 选项配置
这里面的配置交叉编译器、内核版本等。

在这里插入图片描述
当前页面向下翻,可以看到gcc版本。

在这里插入图片描述

Kernel 全部不要选择(有选项,也取消选择)
Filesystem images 全部不要选择(有选项,也取消选择)
Bootloaders 全部不要选择(有选项,也取消选择)
Host utilities 全部不要选择(有选项,也取消选择)

其余选项默认不变
最后记得保存,直接回车默认文件名就行
在这里插入图片描述
在这里插入图片描述
它会保存一个.config隐藏文件在当前文件夹下面。

通过make命令,直接进行编译,大概1小时的时间,这个主要看电脑配置了。。。

1
sudomake

在这里插入图片描述
编译完成之后,检测交叉编译器是否完成,已经版本信息:

1
output/am3354/bin/arm-buildroot-linux-uclibcgnueabi-gcc  -v

这里路径没有加入到环境变量中,
在这里插入图片描述
可以通过修改环境变量,将交叉编译器的路径加入:

1
sudo vim /etc/profile

在这里插入图片描述

碰到的问题

  1. 开始用buildroot-2014.05版本,进行交叉编译器制作,错误如下,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extra/locale/gen_collate.c:3304:13: warning: 'print_starter_all_node' defined but not used [-Wunused-function]
 static void print_starter_all_node(const void *ptr, VISIT order, int level)
             ^
  GEN extra/locale/locale_collate.h
ignoring C locale
Warning: adding UNDEFINED entry for en_US
  GEN extra/locale/lt_defines.h
  HOSTCC extra/locale/gen_wctype
extra/locale/gen_wctype.c: In function 'main':
extra/locale/gen_wctype.c:684:2: warning: #warning fix the upper bound on the upper/lower tables... save 200 bytes or so [-Wcpp]
 #warning fix the upper bound on the upper/lower tables... save 200 bytes or so
  ^
  GEN extra/locale/wctables.h
extra/locale/Makefile.in:179: recipe for target 'extra/locale/wctables.h' failed
make[1]: *** [extra/locale/wctables.h] Error 1
make[1]: Leaving directory '/opt/buildroot-2014.05/output/build/uclibc-0.9.33.2'
package/pkg-generic.mk:167: recipe for target '/opt/buildroot-2014.05/output/build/uclibc-0.9.33.2/.stamp_configured' failed
make: *** [/opt/buildroot-2014.05/output/build/uclibc-0.9.33.2/.stamp_configured] Error 2

尝试解决:

1
2
3
4
cd output/toolchain/uClibc-0.9.33.2
make clean
cd ../../..
make

还是出现莫名的错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
extra/locale/gen_collate.c:2640:13: warning: 'print_starter_node' defined but not used [-Wunused-function]
 static void print_starter_node(const void *ptr, VISIT order, int level)
             ^
extra/locale/gen_collate.c:3304:13: warning: 'print_starter_all_node' defined but not used [-Wunused-function]
 static void print_starter_all_node(const void *ptr, VISIT order, int level)
             ^
  GEN extra/locale/locale_collate.h
ignoring C locale
Warning: adding UNDEFINED entry for en_US
  GEN extra/locale/lt_defines.h
  HOSTCC extra/locale/gen_wctype
extra/locale/gen_wctype.c: In function 'main':
extra/locale/gen_wctype.c:684:2: warning: #warning fix the upper bound on the upper/lower tables... save 200 bytes or so [-Wcpp]
 #warning fix the upper bound on the upper/lower tables... save 200 bytes or so
  ^
  GEN extra/locale/wctables.h
extra/locale/Makefile.in:179: recipe for target 'extra/locale/wctables.h' failed
make[1]: *** [extra/locale/wctables.h] Error 1
make[1]: Leaving directory '/opt/buildroot-2014.05/output/build/uclibc-0.9.33.2'
package/pkg-generic.mk:167: recipe for target '/opt/buildroot-2014.05/output/build/uclibc-0.9.33.2/.stamp_configured' failed
make: *** [/opt/buildroot-2014.05/output/build/uclibc-0.9.33.2/.stamp_configured] Error 2

尝试解决:https://blog.csdn.net/subplot/article/details/82734639

通过查看错误信息,貌似提示uclibc编译出了问题:
在这里插入图片描述
但是交叉编译器确实可以查看版本信息,gcc4.8.2
在这里插入图片描述
但是交叉编译时,出现找不到标准库:
在这里插入图片描述
可以断定,确实C运行库出了问题,标准库函数都没有了,所以我想到了buildroot与uclibc的兼容性问题,但是uclibc官网 https://uclibc.org/downloads/ 已经是比较新的版本了。

解决:果断换了buildroot的2019版本,即可解决该问题。

uclibc是另一c运行库,与glibc相比他更小。当初创建uclinux的时候,需要一个能编译比较小
体积的目标文件的编译器,这个时候就有人写了一个uc-libc库,这个库可以说是uclinux上的一个
glibc移植,但是还是有很多函数没有实现,所以人们只能勉强用它来在uclinux上写程序。后来,
有牛人又写了uclibc,这个是真正意义上的瘦身过后的glibc,完成了很多以前uc-libc不支持的函数。
现在最新的uClibc,官网上说已经完全兼容了glibc。uclibc现在也不只是用在嵌入式系统上面,
一些人也喜欢在标准平台使用它来编译一些程序。虽然uClibc和Glibc在已有的接口上是兼容的,
但有些接口并没有实现

参考链接:
https://embed-linux-tutorial.readthedocs.io/zh_CN/latest/building_image/using_buildroot.html

交叉编译的问题总结比较多:
https://blog.csdn.net/qq_44045338/article/details/109230692?utm_source=app