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 选项配置
这里只更改一个选项
如果不明白意思,可以通过键盘上下左右按钮,进行选择
Toolchain 选项配置
这里面的配置交叉编译器、内核版本等。
当前页面向下翻,可以看到gcc版本。
Kernel 全部不要选择(有选项,也取消选择)
Filesystem images 全部不要选择(有选项,也取消选择)
Bootloaders 全部不要选择(有选项,也取消选择)
Host utilities 全部不要选择(有选项,也取消选择)
其余选项默认不变
最后记得保存,直接回车默认文件名就行
它会保存一个
通过make命令,直接进行编译,大概1小时的时间,这个主要看电脑配置了。。。
1 | sudomake |
编译完成之后,检测交叉编译器是否完成,已经版本信息:
1 | output/am3354/bin/arm-buildroot-linux-uclibcgnueabi-gcc -v |
这里路径没有加入到环境变量中,
可以通过修改环境变量,将交叉编译器的路径加入:
1 | sudo vim /etc/profile |
碰到的问题
- 开始用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