一、前言

装一个交叉编译环境在虚拟机上,之前装的有a40i的源码和qt,还有一些其他工具,现在使用rk3399平台,把他的源码和交叉编译环境装上,写一个记录贴

二、环境

window10

Ubuntu16.04

飞凌OK3399开发板

三、正文

需要装的交叉编译器是aarch64-linux-gnu

在飞凌官方下载ok3399开发板资料OK3399-desktop-release.tar.bz2

然后解压到虚拟机中,一开始折腾了一晚上,在qt配置完环境,一直仍然提示环境不对。

后来才知道,所有的路径默认配置是一个,和我的路径不一样,需要将解压的文件中全部重新编译,按照当前文件路径重新配置更新文件和路径

到解压的文件夹下,打开控制终端,执行./build_ubuntu.sh kernel

然后安装一些工具包,


$ sudo dpkg --add-architecture i386


$ sudo apt-get update


$ sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386


$ sudo apt-get install openssh-server vim git fakeroot make gcc libssl-dev bc


因为最后配置qt想要编译成功,需要GlibB的版本为2.27,低版本的可能为2.23或以下,如果是2.27或以上,则不需要安装工具包



如果路径确认,不需要源码和生产img文件,把所有文件都删除,只保留host文件夹和里面的内容即可,这样子从13G内存一下降到1.4G

之后在正常打开qt,进行新的编译环境配置,应该就是一步到位了

更新工具的sources.list资源和qt配置方式在这里


2022.05.11更新

在使用到customplot后,因为目标机的glibc版本仍然不够,需要2.29,而实际是2.27,故需要升级glibc到2.29,方法如下

测试版本号方式

strings /lib/aarch64-linux-gnu/libc.so.6 | grep GLIBC
getconf GNU_LIBC_VERSION
ldd --version
以上三种方法均可以查看glibc版本号

需要增加源,添加源后保存方法

deb https://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse

官方方法:

参考网址

glibc升级到2.29 linux系统/lib64/libc.so.6版本升级 - 简书

Ubuntu中执行下载

wget http://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz

配置configure文件

../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

配置configure报错

参考网址

glibc升级到2.29 linux系统/lib64/libc.so.6版本升级 - 简书

Ubuntu中执行下载

wget http://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz

配置configure文件

../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

配置configure报错

kvm可以在arm上跑吗 arm安装kvm_bc

使用apt-get install gawk bison

再次配置,配置成功,ls查看,生成makefile

kvm可以在arm上跑吗 arm安装kvm_kvm可以在arm上跑吗_02

 执行make,make install

报错

kvm可以在arm上跑吗 arm安装kvm_bc_03

 上述配置命令有问题,更换如下

../configure --prefix=/opt/glibc-2.14

执行成功后使用sudo make 和 sudo make install

安装前

kvm可以在arm上跑吗 arm安装kvm_qt_04

 安装后

kvm可以在arm上跑吗 arm安装kvm_kvm可以在arm上跑吗_05

我的方法

之前写了一堆,手残当初参考网站给关了,没保存,实在是懒得些了,直接些关键的地方

按照以上方法

首先更新sources.list,添加如下链接deb https://mirrors.ustc.edu.cn/ubuntu-ports/ bionic main restricted universe multiverse

  • 1.之后执行sudo apt-get update 和sudo apt-get upinstall
  • 2.之后下载apt-get install gawk bison,防止后续报错
  • 3.解压glibc-2.29.tar.gz到路径,我使用的是forlinx,/home/forlinx/glibc-2.29
  • 4.之后进入,cd glibc-2.29
  • 5.之后建立build文件夹,mkdir build,并进入cd build
  • 6.之后执行../configure --prefix=/opt/glibc-2.29
  • 7.之后执行sudo make 和 sudo make install
  • 8.接下来是最关键的了,一定要进入root账户,并且最后使用ssh连接设备
  • 9.执行sudo su,密码forlinx
  • 10.执行rm -rf /lib/aarch64-linux-gnu/libc.so.6
  • 11.执行ln -s /opt/glibc-2.29/lib/libc-2.29.so /lib/aarch64-linux-gnu/libc.so.6
  • 12.如果不行就执行LD_PRELOAD=/opt/glibc-2.29/lib/libc-2.29.so ln -s /opt/glibc-2.29/lib/libc-2.29.so /lib/aarch64-linux-gnu/libc.so.6
  • 13.如果还不行就恢复,千万不能重启和关闭root账户终端,否则就重新刷系统吧
  • LD_PRELOAD=/lib/aarch64-linux-gnu/libc-2.27.so ln -s /lib/aarch64-linux-gnu/libc-2.27.so /lib/aarch64-linux-gnu/libc.so.6

慎用,经过测试虽然软连接上了,但是程序有问题,仍然无法开机:LD_PRELOAD=/lib/aarch64-linux-gnu/libc-2.27.so ln -s /opt/glibc-2.29/lib/libc-2.29.so /lib/aarch64-linux-gnu/libc.so.6

更新libm:

rm -rf /lib/aarch64-linux-gnu/libm.so.6

ln -s /opt/glibm-2.29/lib/libm-2.29.so /lib/aarch64-linux-gnu/libm.so.6

LD_PRELOAD=/opt/glibm-2.29/lib/libm-2.29.so ln -s /opt/glibm-2.29/lib/libm-2.29.so /lib/aarch64-linux-gnu/libm.so.6

LD_PRELOAD=/lib/aarch64-linux-gnu/libm-2.27.so ln -s /lib/aarch64-linux-gnu/libm-2.27.so /lib/aarch64-linux-gnu/libm.so.6

查看成没成功用这个指令strings /lib/aarch64-linux-gnu/libc.so.6 | grep GLIBC

查看所有的libc文件用这个指令 sudo find / -name "*libc.so*"

查看编译后的成没成功用这个指令strings /opt/glibc-2.29/lib/libc.so.6 | grep GLIBC

不建议更改开发板glibc,如必要情况下,重新在源码中更新在生成镜像烧写在板子中


20220513更新

折腾了2天,还是因为对linux和交叉编译底层运行机制不够了解,没从根源找清楚问题,就胡乱开始搞,确实是浪费了时间,不过这时间也不算完全凌浪费,也是学到了长教训了,libc.so.6是多么重要,还有是否真的要必须更改升级glibc,我仔细回忆了一下,现象是一个程序之前不带qucustomplot,在window的虚拟机中交叉编译,在目标机forlinx desktop上可以运行,程序加了qucustomplot后,在window的虚拟机中交叉编译,在目标机forlinx desktop上不可以运行,用ldd查询是因为gglibc-2.29没有找到,就一股脑的想升级glibc,但是在forlinx desktop中qt上编译带qcustomplot的程序,缺可以运行出来,只是还需要打包一下(打包见我的ubuntu使用笔记),现在回味了一下,既然带曲线的程序在forlinx desktop上能编译运行,我虚拟机中的不行,是不是因为我虚拟机中libc.so.6的库就是2.29版本,对应目标及需求的glibc库就得是2.29呢,今天心血来潮就试一下,在虚拟机中找到交叉编译打包的libc.so.6文件,用命令查看glibc版本,执行 strings /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libc.so.6 | grep GLIBC,查看如下

kvm可以在arm上跑吗 arm安装kvm_bc_06

果然,是2.29,那么解决问题的思路就有了,也很容易了,我降级在Ubuntu上的,也是可以解决问题,但是整体版本就是稍微低一些,不是很高要求的情况,还是能满足使用的,下面在简单说明一下降级window虚拟机ubuntu中的glibc版本到2.27,目前libc-2.29.so在/root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/路径下,所以我要找个其他环境,安装glibc2.27,然后在软连接一下

首先下载glibc-2.27.tar.gz,官网在这里

操作前一定要给虚拟机进行镜像照相,以防万一

我是放到3399平台用,所以放在3399文件夹中,我的路径是

/root/workspace/allwinner/OK3399/glibc-2.27

解压,创建build文件夹,进入build文件,执行

../configure --prefix=/root/workspace/allwinner/OK3399/opt/glibc-2.27 是为了将编译的文件也放在3399目录下,不与平台其他部分混淆,因为我还有a40i,以后可能还有别的平台,都是独立配置的交叉编译环境。(此步骤不对劲,应该改为用目标及的工具交叉编译glibc,使用glibc编译的文件才能在目标及运行,需要调整为交叉编译,之后在继续运行)

编译成功,build下出现makefile文件,也没有报错,如果有,请自行sudo apt-get相关资源

之后执行sudo make 和 sudo make install,速度嗷嗷的,window虚拟机上的Ubuntu比arm上的ubuntu块太多了,cpu性能在那摆着呢

执行删除就libc.so.6命令rm -rf /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libc.so.6

执行软连接命令

ln -s /root/workspace/allwinner/OK3399/opt/glibc-2.27/lib/libc-2.27.so /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libc.so.6

恢复

 ln -s /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libc-2.29.so /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libc.so.6

如果提示文件不存在什么的,请不要复制命令,用手敲,tab补全,敲一遍试试,可能就好了

再次用命令查看strings /root/workspace/allwinner/OK3399/host/aarch64-buildroot-linux-gnu/sysroot/lib/libc.so.6 | grep GLIBC

已经是2.27版本

kvm可以在arm上跑吗 arm安装kvm_linux_07

 之后重启一次,开机成功

之后再次编译之前的程序,会提示报错,提示不兼容

kvm可以在arm上跑吗 arm安装kvm_bc_08

不兼容原因就是libc是虚拟机的桌面系统编译的,不是交叉编译的

后来把目标机器的lib/aarch64_linux_gnu下的文件全部拷贝到虚拟机的lib中,在进行软连接,后又提示QT core需要glibc2.28,又折腾几天发现此问题是qt版本不够,原来是qt5.9.0后来升级一个5.9.5的版本,就可以了

四、结语

此人已经无力总结