Ubuntu交叉编译环境配置

Ubuntu交叉编译环境配置

近期遇到了一些交叉编译相关的问题,这里以Ubuntu 24.04上的arm32的交叉编译为例,介绍下如何在Linux中配置交叉编译环境。

1. 准备交叉编译工具链

交叉编译工具链是指可以在宿主机上运行但编译目标平台不同的编译工具链。

交叉编译工具可以使用包管理器直接安装,如:

sudo apt install gcc-arm-linux-gnueabihf

通过包管理器安装是比较推荐的方法,可以省去一些配置的时间,如果涉及到glibc版本兼容问题等可以考虑自行编译其他版本的gcc进行安装。

从源码编译可以参考这里

2. 配置包管理器

在进行交叉编译时使用到其他库是不可避免的。而安装在系统上的库,在交叉编译时无法直接使用。对于这样的问题,通常的解决方案都是下载库源码,利用交叉编译器重新编译。但实际上,对于arm32等常见架构,我们完全可以从包管理器直接获取到所需的库。

2.1 添加架构

对于Debian系系统,我们可以使用dpkg来添加所需的架构:

sudo dpkg --add-architecture armhf

2.2 添加源

如果你只是在aarch64的机器上添加arm32的库,那么可以跳过这一步。

由于x86与arm使用不同镜像源地址,所以我们需要修改原有的源配置,并添加arm32的源。

首先是修改原有的源配置文件,对于Ubuntu 24.04 LTS版本,其源配置文件格式为DEB822,路径为/etc/apt/sources.list.d/ubuntu.sources。我们需要在为每个源指定架构,在末尾添加Architectures: amd64

个人使用的配置文件如下(清华源):

Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: amd64

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
Enabled: no
Types: deb-src
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: amd64

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: amd64

Enabled: no
Types: deb-src
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: amd64

# 预发布软件源,不建议启用

# Types: deb
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# Suites: noble-proposed
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# # Types: deb-src
# # URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# # Suites: noble-proposed
# # Components: main restricted universe multiverse
# # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

对于24.04以下的使用 One-Line-Style 格式的配置文件的版本,需要在deb后面添加[arch=amd64],就像这样:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
# deb-src [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble main restricted universe multiverse
deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
# deb-src [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-updates main restricted universe multiverse
deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse
# deb-src [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb [arch=amd64] http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse
# deb-src [arch=amd64] http://security.ubuntu.com/ubuntu/ noble-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse
# # deb-src [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ noble-proposed main restricted universe multiverse

然后我们添加arm32的源,路径为/etc/apt/sources.list.d/armhf-cross-compile.sources。注意arm32使用的源为ubuntu-ports,同样要为每个源指定架构名称。

下面同样是个人的配置,可以参考:

Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: armhf

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
Enabled: no
Types: deb-src
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: armhf

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
Types: deb
URIs: http://ports.ubuntu.com/ubuntu-ports/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: armhf

Enabled: no
Types: deb-src
URIs: http://ports.ubuntu.com/ubuntu-ports/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Architectures: armhf

# 预发布软件源,不建议启用

# Types: deb
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports
# Suites: noble-proposed
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# Types: deb-src
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports
# Suites: noble-proposed
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

使用 One-Line-Style 格式的配置文件的版本需要在复制arm镜像源配置后,在每行的deb后面加上 [arch=armhf]即可,格式参考上面的示例。

3. 安装所需的库

在完成以上的配置后,我们需要先更新包管理器索引:

sudo apt update

然后就可以使用包管理器来安装所需要的库了,在安装时需要在包名后面加上架构名称,如alsa库:

sudo apt install libasound2-dev:armhf