为什么要交叉编译?

交叉编译是在一个平台上生成另一个平台的代码,如在x86上编译ARM程序。这在目标系统资源有限或架构不同的情况下必要。安装交叉编译工具链,如在Linux上使用arm-linux-gnueabihf-gcc,配置环境变量后,可以编译目标平台的代码。对于带wiringPi库的项目,需要确保链接库的格式正确,可能需要软链接或解决依赖问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是交叉编译、为什么要交叉编译

1、什么是交叉编译?

交叉编译:是在一个平台上生成另一个平台上的可执行代码。比如我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

我们在Windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行

编译:是在一个平台上生成在该平台上的可执行代码,

2、为什么要交叉编译?

2.1、交叉编译的目标系统一般都是内存较小、显示设备简陋甚至没有,没有能力在其上进行本地编译,无法运行我们所需要编译器,比如C51,C51 交叉编译的发生在keil(集成环境上面)

2.2、有能力进行源代码编译的平台CPU架构或操作系统与目标平台不同;

平台运行需要两样至少东西:bootloader(启动引导代码)以及操作系统核心

交叉编译器用到的工具:交叉编译器

 要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。

如:在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。

二、交叉编译工具链的安装

  •  树莓派交叉编译工具链安装

下载地址:

https://github.com/raspberrypi/

  • OrangePi_Zero2交叉编译工具链安装

参考OrangePi_Zero2用户手册Orange Pi Zero2-Orange Pi官网-香橙派(Orange Pi)开发板,开源硬件,开源软件,开源芯片,电脑键盘

从共享文件夹拷贝到工作目录

cp /mnt/hgfs/sharefromwindows/tools-master.zip .

解压

unzip tools-master.zip

进入文件夹bin目录

cd /home/zyf/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

获取路径    pwd

配置环境变量

1、环境变量临时有效

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/zyf/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

2、环境变量永久有效

修改工作目录下的.bashrc 隐藏文件,配置命令终端的

vi /home/zyf/.bashrc 

在文件最后一行加入

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/zyf/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

加载配置文件,马上生效配置

source /home/zyf/.bashrc

三、交叉编译

检查下交叉编译工具对不对:

arm-linux-gnueabihf-gcc -v

4.8.3

编译:

arm-linux-gnueabihf-gcc  xxx.c -o xxx

eg:

服务端:gcc ftpserver.c -I ./ -o serverInX86         

客户端:arm-linux-gnueabihf-gcc ftpclient1.c -I ./ -o clientInpi

把编译生成的可执行文件下载到开发板:

scp clientInPi pi@192.168.101.33:/home/pi

指令 文件名 开发板用户名@开发板地址:开发板的绝对路径

注意服务端和客户端需要在同一网段

若出现public key问题,用以下

scp -o StrictHostKeyChecking=no ftpclientARM pi@192.168.101.33:/home/pi

四、带wiringPi库的交叉编译如何进行

1、正常我们先要交叉编译wiringpi库,编译出的库适合树莓派,这时候交叉编译可执行程序的试试,链接库的格式也是正确的。

2、通过-I –L来指定

因为链接的库的格式不对,是宿主机的平台,会出现错误

解决:把树莓派上的wiringpi库拿上来用

3、软链接的引入?

软链接:

1、软连接文件有类似于Windows的快捷方式

2、在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

3、只在你选定的位置上生成一个文件的镜像,不占用磁盘空间

4、如何生成软链接?

ln -s libwiringPi.so.2.52 libwiringPi.so

指令 参数   要被链接的文件       软链接名

5、硬链接

硬链接:

ln  libwiringPi.so.2.52 libwiringPi.so

它会在你选定的位置上生成一个和源文件大小相同的文件

  6、编译生成

解压wiringpi库的tar.gz文件

命令:tar -zxvf xxx.tar.gz -C /xxx/

查看命令:man tar

编译生成

arm-linux-gnueabihf-gcc relay1.c -I /home/zyf/share/WiringPi/wiringPi -L. –lwiringPi

(这里编译不成功,提示需要用到glibc库,

解决方案:1、把树莓派和ubantu对应的glibc,升级到一致2、直接在树莓派编译,简单高效)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值