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