Ubuntu22.04开启交叉编译
序言
之前一直存在某种幻觉: 在docker的arm架构的系统中编译就是交叉编译,直到今天偶然通过AI得知在x86的机器上编译arm才叫做交叉编译,顿时有种醍醐灌顶的感觉,怪不得叫交叉呢。虽然并没有搞嵌入式的打算,但是学习一下这些不太有用的知识,可能未来会有用....吧。或许吧。
准备
-
环境准备
# 开启 arm64 外部架构
sudo dpkg --add-architecture arm64
sudo apt-get update
# 交叉工具链 + 基础工具
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu pkg-config
-
关键环境变量(让 pkg-config 指向 arm64)
export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_LIBDIR
这里推荐加入一个alias,一键在终端执行ecc即可,非常好使
alias ecc=export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig;export PKG_CONFIG_PATH=$PKG_CONFIG_LIBDIR
-
新建 toolchain 文件 cmake/cross-aarch64.cmake
# cmake/cross-aarch64.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
# 交叉查找策略:仅在目标架构前缀下找库/头/包
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
# 让 CMake 调用 pkg-config 时返回 arm64 的路径
set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig")
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_LIBDIR}")
-
CMakeLists.txt 示例片段(用 pkg-config 获取依赖)
cmake_minimum_required(VERSION 3.16)
project(demo LANGUAGES C CXX)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SPEEXDSP REQUIRED speexdsp)
add_executable(demo main.cpp)
-
编译
cmake -S . -B build-aarch64 -DCMAKE_TOOLCHAIN_FILE=cmake/cross-aarch64.cmake
cmake --build build-aarch64 -j
当然也可以不用cmake
aarch64-linux-gnu-g++ -O2 -pipe -o app-aarch64 main.cpp \
$(pkg-config --cflags --libs portaudio-2.0 speexdsp)
-
验证
file build-aarch64/demo || file ./app-aarch64
# 期望:ELF 64-bit LSB executable, ARM aarch64, ...
readelf -h build-aarch64/demo | grep 'Machine\|Class'
# 期望:Machine: AArch64
这里第一个file命令输出是满足预期的,但是readelf没有输出...
-
运行
在 arm64 设备/容器上直接运行;或 x86 主机上装 QEMU 测试:
sudo apt-get install -y qemu-user
qemu-aarch64 ./build-aarch64/demo
可谓之十分的交叉了

浙公网安备 33010602011771号