交叉编译链实战:在开发板上轻松运行程序
交叉编译指的是在一种平台上编译出另一种平台上运行的程序的编译过程。相对于PC端,由于嵌入式硬件的功耗与内存,储存等性能的先天不足,而编译又需要消耗大量的资源,为了使嵌入式开发板的资源得到合理利用,往往需要将项目代码在主机平台编译成开发板能运行的程序再传输到开发板进行运行。本篇用到的开发板为君正T23,交叉编译链为mips-gcc540-64bit,远程服务器Ubuntu为20.04
一、交叉编译链的配置
1、主机端
1.1 获取方式
对于许多开源的交叉编译链来说,我们可以直接从源地址下载就好,比如Linaro的GCC编译工具链,详细教程可见ARM-Linux 交叉编译工具链安装。有些没有开源的,相信大家的特殊渠道关系也不难获取(❁´◡`❁),如果实在不行也可以通过购买等渠道进行获取,比如下面的:
对于学生或公司员工来说,相应的开发交叉编译工具或学校或公司一般也会进行提供,而我正好属于这一类。
1.2 SVN的安装
SVN是一个开源的集中式版本控制系统,与Git类似(Git是分布式),主要功能是允许多人共享,修改和更新同一资源;记录资源的每一次变更,能随时回溯到上n次更改点来防范风险。既然SVN这么强,那么首先我们便要安装SVN,进入官网https://tortoisesvn.net/downloads.html依次下载安装,汉化包官网也自带,下拉一点就能看到Language packs。要注意的是SVN安装时这一步如图所选,直译是安装命令行客户工具完整版,也就是将软件集成为鼠标右键的插件
鼠标右键如图进入设置
然后选择中文,当然你喜欢英文也可以不改
1.3 获取交叉编译链
鼠标右键调出SVN,选择检出(SVN Checkout),填上学校/公司的SVN项目地址,再选一个合适路径,点击OK
然后输入账号密码,点击确定,等待下载完成即可。
2、服务器端
2.1 交叉编译链的传输
用一个你喜欢的方式(tftp,xftp等)将下载好的交叉编译链压缩包传输到远程服务器,这里我用的是共享文件夹的方法,有关共享文件夹如何配置,请参考我的这篇文章映射网络驱动器实现windows与Linux文件传输
然后服务器cd命令进入该目录ls命令进行查看
通过以下指令进行解压缩
tar -xzvf toolchain.tar.gz #解压工具链
解压完成后进入目录查看bin文件并记住该路径
2.2 配置环境变量
利用以下指令进入环境变量配置文件
sudo vim /etc/profile
按i进入编辑模式,光标移到编辑栏最下面,将刚才记忆的交叉编译路径按以下方式输入进去
export PATH=$PATH:/home/ubuntu/resource/toolchain/T23/mips-gcc540-glibc222-64bit-r3.3.0.smaller/bin
输入:wq保存退出后可以再输入cat指令查看修改结果
输入交叉编译指令查看是否配置成功
mips-linux-gnu-gcc -v #查看交叉编译链版本信息
完成 ψ(`∇´)ψ
二、交叉编译链的使用
1、大体流程
先在window用notepad++(其他编辑器也行)写一个小程序,然后传入Ubuntu服务器
然后进入该目录,用以下指令进行编译
mips-linux-gnu-gcc -o hello hello.c
生成可执行文件如下
运行试试
果然报错,这是正常的,因为交叉编译的程序在本地执行不了,只能在交叉编译的指定平台运行
利用tftp将hello程序传输到开发板,如何用tftp传输可参考我的这篇文章利用tftp实现开发板与Linux服务器的文件传输
然后用以下指令赋予开发板运行权限
chmod 777 hello
运行
结果竟然还是报错!这是为什么?⊙﹏⊙∥
2、所遇问题
原来我使用的交叉编译指令是简写,默认链接的是 GNU C Library(glibc)库(C语言标准库),但是对于嵌入式开发板而言,直接装入一个C语言标准库仍然很大,所以它们一般会使用uClibc这个轻量级的C语言标准库
明白了这一点,于是我再重新编译
mips-linux-uclibc-gnu-gcc hello.c -o xxx
再次传入开发板赋权执行
成功输出了Hello World!
三、总结
本篇主要交叉编译链的配置和使用的大体流程,其中也遇到了因为动态链接库错误而导致运行失败的问题,好在都迎刃而解。我们主要还是要了解开发板的各种配置,以及我们在编译代码时的指令没必要为图方便简写,有时一些大错误也往往是简写不当造成的
作者:交织面具