Ubuntu 22.04配置dpkg Multiarch用于Beaglebone Black交叉编译时的libc依赖错误问题
我之前也碰到过类似的坑,在Ubuntu 22.04上给Beaglebone Black做交叉编译时,Multiarch的配置很容易因为源架构区分不清、依赖版本匹配问题出乱子。结合你的情况,咱们一步步来解决:
1. 先把APT源的架构区分清楚
你一开始遇到的404错误,核心原因就是Ubuntu Jammy的普通源(比如dk.archive.ubuntu.com)根本没有armhf架构的包,只有ports源才有。而且你之前的源配置没明确区分amd64和armhf的源,导致apt乱找包。
打开/etc/apt/sources.list以及/etc/apt/sources.list.d/下的所有源文件,给非ports开头的源加上[arch=amd64]标识,确保它们只处理x86_64的包:
# 修改前的主源 deb http://dk.archive.ubuntu.com/ubuntu/ jammy main universe multiverse # 修改后 deb [arch=amd64] http://dk.archive.ubuntu.com/ubuntu/ jammy main universe multiverse
然后把armhf的源补全,确保所有armhf相关的包都从ports源拉取:
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ jammy main universe multiverse deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main universe multiverse deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ jammy-backports main universe multiverse deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports/ jammy-security main universe multiverse
2. 重置Multiarch配置,清理缓存
先把之前可能混乱的架构配置清掉,重新初始化:
# 移除旧的armhf架构配置 sudo dpkg --remove-architecture armhf # 重新添加armhf架构 sudo dpkg --add-architecture armhf # 更新APT缓存,确保没有404错误 sudo apt update
3. 手动理顺libc依赖链
现在apt能正确找到armhf包了,但自动依赖匹配可能还是会卡,咱们先手动安装关键的libc包:
# 安装指定版本的libc6:armhf,对应Jammy的版本 sudo apt install libc6:armhf=2.35-0ubuntu3
安装完成后,再依次补上它的依赖项:
sudo apt install libc6-dev:armhf linux-libc-dev:armhf libtirpc-dev:armhf libtirpc3:armhf
最后再装你需要的libsqlite3-dev:armhf:
sudo apt install libsqlite3-dev:armhf
如果中间出现依赖错误,用apt -f install让系统自动修复依赖链:
sudo apt -f install
4. 搞清楚crossbuild和Multiarch的区别
你已经装了crossbuild-essential-armhf,这个包是给你提供交叉编译工具链的,对应的头文件和库都在/usr/arm-linux-gnueabihf/目录下。而Multiarch的libxxx-dev:armhf包主要是用来在主机上运行armhf程序,或者让主机系统识别armhf库的。
如果你的需求只是交叉编译代码到armhf架构,其实不一定需要装Multiarch的-dev包。直接用交叉编译工具链配合pkg-config指定路径就行:
# 编译时用交叉编译器,指定pkg-config的交叉路径 arm-linux-gnueabihf-gcc your_code.c -o your_arm_binary $(PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig/ pkg-config --cflags --libs sqlite3)
这样编译器会自动用crossbuild工具链提供的库,不用依赖Multiarch包。
备注:内容来源于stack exchange,提问作者HANSEMINATOR

