[ Content contribution] linux进阶教程(三)如何从源代码为多架构打包 .deb文件
Tofloor
poster avatar
玄圭SwenGway
deepin
2025-01-16 12:56
Author

如何从源代码为多架构打包 .deb 文件

声明:其实我只有x86比较熟悉,arm和loongarch其实都不是很会,只是有坛友询问,于是我通过查找相关资料,询问相关大佬,以及结合我自己的理解和经验,总结出来的一篇文章。可能文章错误疏漏之处难以避免,所以本文经供参考,实际工作请进行更深入的学习或资讯相关技术人员,有错误请指出,谢谢,有部分内容也使用了AI。

在之前的教程中,我们学习了如何将源码打包成 .deb 包。但如果你想支持 AMD64(主流桌面架构)、ARM64(移动设备架构,比如树莓派)和 LoongArch64(国产龙芯架构),就需要一点额外的努力。这篇教程将带你从零开始,从源码编译到打包,完成适配多个架构的 .deb 文件制作。

为了更好地说明,我们继续以 GNU Hello(著名的“Hello, World!”程序)为例,一步步实现多架构支持。


一、什么是架构?

架构 指的是计算机处理器的类型和指令集。常见架构包括:

  • AMD64:也叫 x86_64,主流的 64 位 PC 和服务器架构。
  • ARM64:也叫 AArch64,广泛应用于嵌入式设备、树莓派等。
  • LoongArch64:龙芯自主研发的 64 位架构,主要用于国产硬件。

为什么需要为多架构编译?
因为不同架构的处理器工作方式不同,二进制文件必须针对特定架构编译才能运行。Windows 大多数软件是直接打包 x86 和 x86_64 两种架构,而 Linux 允许灵活支持更多架构。


二、准备工具

要完成多架构编译和打包,你需要以下工具:

sudo apt update
sudo apt install build-essential checkinstall dpkg-dev \
                 gcc-aarch64-linux-gnu gcc-loongarch64-linux-gnu \
                 qemu qemu-user qemu-user-static \
                 libc6-dev-arm64-cross libc6-dev-loongarch64-cross
  • build-essential:常用编译工具集合。
  • checkinstall:打包工具,可以直接将源码编译成果打包为 .deb 文件。
  • gcc-aarch64-linux-gnugcc-loongarch64-linux-gnu:交叉编译工具链,用于在当前系统上为 ARM 和 LoongArch 架构编译代码。
  • qemuqemu-user-static:运行和测试非原生架构的程序。

三、下载源码

以 GNU Hello 为例,下载源码:

wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
tar -xvzf hello-2.10.tar.gz
cd hello-2.10

如果源码压缩包中没有 configure 文件,说明需要生成自动化配置脚本:

autoreconf -i

运行 autoreconf 后,configure 文件就会生成。如果还有问题,可以执行作者提供的 ./autogen.sh 脚本。


四、多架构编译

1. 创建独立的编译目录

为每种架构创建一个编译目录,防止文件冲突:

mkdir build-amd64 build-arm64 build-loongarch64

2. 逐一编译每种架构

(1) 编译 AMD64

这是当前系统的架构,可以直接编译:

cd build-amd64
../configure --prefix=/usr
make
cd ..
(2) 编译 ARM64

使用交叉编译工具链:

cd build-arm64
CC=aarch64-linux-gnu-gcc ../configure --host=aarch64-linux-gnu --prefix=/usr
make
cd ..
(3) 编译 LoongArch64

同理,指定 LoongArch64 的交叉编译工具链:

cd build-loongarch64
CC=loongarch64-linux-gnu-gcc ../configure --host=loongarch64-linux-gnu --prefix=/usr
make
cd ..

3. 解决常见问题

如果在编译过程中提示找不到目标架构的库:

sudo apt install libc6-dev-arm64-cross libc6-dev-loongarch64-cross

如果 configure 文件提示不支持某架构,更新 config.subconfig.guess 文件:

wget -O config.sub https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
wget -O config.guess https://git.savannah.gnu.org/cgit/config.git/plain/config.guess

五、生成 .deb

1. 为每个架构生成 .deb 文件

(1) 使用 checkinstall 打包
  • AMD64 打包
    cd build-amd64
    sudo checkinstall --pkgname=hello --pkgversion=2.10 --arch=amd64
    cd ..
    
  • ARM64 打包
    cd build-arm64
    sudo checkinstall --pkgname=hello --pkgversion=2.10 --arch=arm64
    cd ..
    
  • LoongArch64 打包
    cd build-loongarch64
    sudo checkinstall --pkgname=hello --pkgversion=2.10 --arch=loongarch64
    cd ..
    
(2) 使用 dpkg-buildpackage 打包

如果你已经配置了 debian/ 文件夹,可以直接运行:

dpkg-buildpackage -us -uc -b

2. 检查生成的文件

打包完成后,检查生成的 .deb 文件:

  • hello_2.10_amd64.deb
  • hello_2.10_arm64.deb
  • hello_2.10_loongarch64.deb

六、为 .deb 包添加多架构支持

修改 control 文件以支持多架构:

Architecture: amd64 arm64 loongarch64

然后重新打包:

dpkg-buildpackage -us -uc -b

七、常见问题及解决方法

  1. 依赖问题
    如果 .deb 文件安装失败,提示依赖错误,需要在 control 文件中声明依赖项:
    Depends: libc6 (>= 2.28)
    
  2. 交叉编译库丢失
    • 确保目标架构的库文件已安装:
      sudo apt install libc6-dev-arm64-cross libc6-dev-loongarch64-cross
      
  3. 打包冲突
    如果多次运行 checkinstall 导致文件冲突,清理后重试:
    make clean
    

八、总结

通过上述步骤,你可以为 AMD64ARM64LoongArch64 架构分别生成 .deb 文件,实现多架构支持。虽然过程稍显繁琐,但只要你愿意花时间琢磨,Linux 的多架构支持会让你的软件触及更多设备和用户群体!继续加油,你已经很棒了!

最后,别问我玲珑软件包怎么搞,我不会😂哪位大佬能够出个详细的教程教教我就好了。

Reply Favorite View the author
All Replies
马小松
deepin
2025-01-16 13:05
#1

agree

Reply View the author
deepin小助手
Super Moderator
OM
2025-01-16 13:32
#2

赞赞赞,感谢分享

Reply View the author
liuhongwei11
deepin
2025-01-16 14:04
#3

持续跟进学习,感谢分享。

Reply View the author
乾豫恒益
deepin
2025-01-16 15:23
#4

学习中。。。

Reply View the author
鲜衣怒马
deepin
2025-01-16 15:33
#5

mark 感谢大佬的贡献

Reply View the author
kero990
deepin
2025-01-17 11:40
#6

学了很久还是没搞懂,因为有obs托管编译的存在,一直想用这个

但这个只支持 dpkg-buildpackage -us -uc -b的方式编译

而我想编译的大部分都是用cmake,meson这类构建的,我不知道怎么能转换成debian源码包

Reply View the author
momen
deepin
2025-01-20 11:25
#7

很棒kissing_heart

Reply View the author