返回顶部

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

可谓之十分的交叉了

posted @ 2025-08-25 21:23  Swetchine  阅读(58)  评论(0)    收藏  举报