交叉编译介绍
-
什么是交叉编译?
-
为什么要交叉编译?
-
平台上不允许或不能安装我们所需的编译器比如C51
- 因为目的平台上的资源匮乏,无法运行我们所需要的编译器
-
树莓派是不是不需要交叉编译?
- 错。也要:树莓派有时又是因为目的平台还没有建立,连操纵系统都没有,根本谈不上运行什么编译器(操作系统也是代码也需要编译)
- 平台运行至少需要两样东西:bootloader(启动引导代码)以及操作系统核心
-
宿主机(host)
- 编辑和编译的平台,一般是基于x86的PC机。通常也被称为主机
-
目标机(target)
- 用户开发系统,通常都是非X86平台。host编译得到的可执行代码在target上运行
-
交叉编译工具链安装
- 获取工具(该方法获取的交叉编译工具应该只能支持32位的arm,以下演示的也是只能编译出32位arm程序。64位arm另外补充)
- Raspberry Pi · GitHub
- 下载好后传到ubuntu
- 解压并找到找到需要的工具
- unzip xxx.zip
- cd tools-master
- cd arm-bcm2708
- 我的交叉编译平台是64位的所以选
这是所需要的工具
- 两种使用方式(我已经配置过了,仅作参考)
- 临时有效(配置环境变量)
- 显示当下环境变量echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- 显示当前路径pwd
- /home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- 配置环境变量:
- export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- 显示当下环境变量echo $PATH
- 永久有效
- vi /home/theone/.bashrc(修改工作目录下的.bashrc)
- 在最后一行加入
- export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- source /home/theone/.bashrc
- 在最后一行加入
- vi /home/theone/.bashrc(修改工作目录下的.bashrc)
- 临时有效(配置环境变量)
- 补充
-
64位arm交叉编译工具(不知道有没有更新的,目前只找到这个)
- 去网站下载(以旧版的编译工具演示)
-
解压
- tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
-
使用方法和上面32位arm的配置一样
- 临时有效
- 显示当下环境变量echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/theone/Desktop/lessonTool/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
- 显示当前路径pwd
- /home/theone/Desktop/lessonTool/arm-64/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
- 配置环境变量
- export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/arm-64/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
- 显示当下环境变量echo $PATH
- 永久有效
- vi /home/theone/.bashrc(修改工作目录下的.bashrc)
- 在最后一行加入
- export PATH===/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:==/home/theone/Desktop/lessonTool/arm-64/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
- 在最后一行加入
- source /home/theone/.bashrc
- vi /home/theone/.bashrc(修改工作目录下的.bashrc)
- 临时有效
-
验证
- aarch64-linux-gnu-gcc demo.c
- 使用file指令查看产生的编译程序
- 使用file指令查看产生的编译程序
- 将程序传送到树莓派上:scp demo theone@192.168.x.x:/home/theone/Desktop
- 运行结果:
出现了GLIBC版本不匹配问题
- 对于这个问题在网上找了很久,最后发现把树莓派上的libc库拿到ubuntu上作为指定链接库编译更为保守且简单(之前因为升级树莓派的GLIBC而导致树莓派指令无法正常使用导致最后重新刷机…)
- 步骤
- 来到树莓派根目录下/lib/aarch64-linux-gnu(我的是64位的,32位的名字有区别但结尾应该都是-gnu。想要的文件在这个文件夹里)
- 将该文件夹中的libc.so.6传到ubuntu上:sudo scp libc.so.6 theone@192.168.x.x:/home/theone/Desktop/…
- ubuntu上编译:
- 编译生成的demo传到树莓派上:scp demo theone@192.168.x.x:/home/theone/Desktop
运行成功
- 运行结果:
- aarch64-linux-gnu-gcc demo.c
-