在Debian上进行针对Raspberry Pi Zero的交叉编译 – 尝试使用共享库
大致内容
在Raspberry Pi Zero上运行在Debian上编译的C语言程序。
希望创建一个能够使用共享库的环境。
首先,让我们确保libusb和libjpeg等库可用。
我正在继续介绍在Ubuntu上为Raspberry Pi Zero进行交叉编译的经验,但是我现在正在尝试将主机机器更换为Debian(原因稍后解释)。
环境
主机:Debian 10.6.0 在 Virtual Box 6.1 上运行,宿主机为 Windows 10
目标设备:Raspberry Pi Zero WH
流程
安装ARM编译器
$ sudo apt install crossbuild-essential-armel
上次我试着安装了g++-arm-linux-gnueabi,但是据说crossbuild-essential-armel已经包含了它,所以我会尝试安装这个。总的来说,最后用的是gcc,所以差别不会太大。
安装共享库
添加架构,并且…
$ sudo dpkg --add-architecture armel
编辑 sources.list 文件。添加apt要引用的软件源。
$ sudo nano /etc/apt/sources.list
在sources.list的末尾添加以下内容。
对于armel版本,请确保也参考ftp.jp.debian.org。
deb [arch=armel] http://ftp.jp.debian.org/debian buster main
通过更新并安装库来获得适用于armel的库:可以通过添加armel来获取armel适用的库。
$ sudo apt update
$ sudo apt install libusb-dev:armel
$ sudo apt install libjpeg-dev:armel
如果有为Ubuntu的armel版本发布的软件包,那么将其添加到sources.list列表中,我认为在Ubuntu上可以实现相同的功能。但是我找不到为Ubuntu的armel版本发布的软件包。
我在Ubuntu中尝试添加ftp.jp.debian.org/debian,但出现了类似于“未经签名”的错误,无法安装。这是可以理解的。
有没有一种强制安装的方法呢?(我已经尝试通过.deb文件安装,但是由于依赖关系非常复杂,所以放弃了)
搭建
这次要尝试构建的程序在这里。
#include <stdio.h>
#include <usb.h>
int main()
{
printf("call usb_init()\n");
usb_init();
printf("OK\n");
return 0;
}
只是调用usb_init()这个毫无意义的程序。
也不会进行usb_init()之后的清理(是否需要进行任何操作呢?)。
构建这个。
$ arm-linux-gnueabi-gcc -march=armv6 testUsbLib.c -o testUsbLib_armv6 -lusb
給你展示一下動作
如果成功构建,将生成的testUsbLib_armv6复制到Raspberry Pi Zero的适当文件夹中。
$ testUsbLib_armv6
call usb_init()
OK
这样,它会以这种方式运作。
虽然没有任何事件发生,但是、
总结
由于libusb的依赖关系较少,所以即使是通过手动安装.deb文件也可以解决问题,但是像libjpeg这样的库有很多依赖关系,手动安装的步骤太多我就放弃了。这次的方法中包含了依赖关系的安装,所以好像成功地运行了起来。
顺便一提,现在我们还通过这种方法验证了libusb、libjpeg和libtiff的运行。
如果有人能告诉我,在Ubuntu上是否可以使用类似的方法(是否有发布针对armel的软件包等),我会非常感激。
添加附注
我写了续篇文章。
-
Debian上でRaspberry Pi Zero向けクロスコンパイル ~自作の共有ライブラリを作ってみる