前言

本文主题:如何在amd64的ubuntu主机上交叉编译可在arm64的ubuntu主机上运行的应用(把这句话给豆包,豆包就会给出手把手教程了)。

下文基于豆包给出的解决方案修改。

一、开发环境说明

  • 开发平台:华硕飞行堡垒,amd64(x86_64),Ubuntu22.04

  • 目标设备:
    - 主机:OrangePi Zero 2W,arm64(aarch64),Ubuntu22.04
    - 显示屏:雕塑家MF133LR,Mini HDMI

  • 交叉编译:在 amd64 上生成直接能在 arm64运行的程序

二、下载LVGL源码

amd64 Ubuntu开发平台中下载LVGL源码

git clone https://github.com/lvgl/lv_port_linux.git
cd lv_port_linux/
git submodule update --init --recursive

三、安装交叉编译环境

安装 arm64 编译器 + 所有依赖

amd64 Ubuntu开发平台中安装 arm64 编译器 + 所有依赖

sudo apt update

# 安装交叉编译器
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 安装 arm64 版本的 SDL2 ,EVDEV开发库
sudo apt install libsdl2-dev:arm64 libsdl2-image-dev:arm64 libevdev-dev:arm64

:arm64 意思是:安装 arm64 架构的库,给交叉编译使用。

常见问题

如果出现报错:

E: Unable to locate package libsdl2-dev:arm64
E: Unable to locate package libsdl2-image-dev:arm64
E: Unable to locate package libevdev-dev:arm64

则是因为amd64 Ubuntu 没有启用 arm64 架构支持,所以系统找不到 arm64 版本的库。可按如下步骤解决:

第一步:添加 arm64 架构到系统(必须)

sudo dpkg --add-architecture arm64
sudo apt update

第二步:修复 apt 源(关键!否则依然找不到包)

Ubuntu 默认源不支持跨架构下载,必须修改 sources.list

自动修复命令(直接复制运行)

sudo sed -i 's/^deb http/deb [arch=amd64,i386] http/g' /etc/apt/sources.list
sudo sed -i 's/^deb http/deb [arch=amd64,i386] http/g' /etc/apt/sources.list.d/*.list

然后添加 arm64 专用源

echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $(lsb_release -cs) main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $(lsb_release -cs)-updates main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $(lsb_release -cs)-security main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $(lsb_release -cs)-backports main restricted universe multiverse" | sudo tee /etc/apt/sources.list.d/arm64.list

第三步:再次更新并安装

sudo apt update
sudo apt install libsdl2-dev:arm64 libsdl2-image-dev:arm64  libevdev-dev:arm64

第四步:安装交叉编译器

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

四、CMake 交叉编译脚本

LV_PORT_LINUX源码根目录新建一个文件,命名为:toolchain-arm64.cmake
内容直接复制下面这段:

# ==============================================================================
# 交叉编译工具链:x86_64 → arm64 (aarch64)
# ==============================================================================

# Usage:
#--Build for desktop_xfce_linux
# cmake -B build_arm64_sdl -DCONFIG=sdl -DCMAKE_TOOLCHAIN_FILE=./toolchain-arm64.cmake
# cmake --build build_arm64_sdl -j$(nproc)
#--Build for server_linux
# cmake -B build_arm64_fb -DCONFIG=fbdev -DCMAKE_TOOLCHAIN_FILE=./toolchain-arm64.cmake
# cmake --build build_arm64_fb -j$(nproc)

# 1. 指定 pkg-config 路径
set(PKG_CONFIG_EXECUTABLE /usr/bin/aarch64-linux-gnu-pkg-config CACHE FILEPATH "Cross pkg-config")

# 2. 目标系统与架构
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 3. 指定交叉编译器
set(CMAKE_C_COMPILER   aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

# 4. 核心:指定 ARM64 库路径(关键!)
set(CMAKE_FIND_ROOT_PATH 
    /usr/aarch64-linux-gnu
    /usr/lib/aarch64-linux-gnu
    /usr/include/aarch64-linux-gnu
)


# 5. 强制 CMake 只查找 ARM64 库,不会再去 x86_64 目录找文件!
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)

在这里插入图片描述

五、编译

目标平台操作系统为xfce_ubuntu(桌面版)

进入LV_PORT_LINUX源码根目录,运行:

cmake -B build_arm64_sdl -DCONFIG=sdl -DCMAKE_TOOLCHAIN_FILE=./toolchain-arm64.cmake
cmake --build build_arm64_sld -j$(nproc)

若需全屏显示,则将lv_port_linux/configs/sdl.defaults中的LV_SDL_FULLSCREEN设置为1即可
在这里插入图片描述
编译完成后,在build_arm64_sdl/bin/目录下生成的二进制文件lvglsim,可直接复制到arm64 Ubuntu 主机运行。

目标平台操作系统为server_ubuntu(服务器版)

进入LV_PORT_LINUX源码根目录,运行:

cmake -B build_arm64_fb -DCONFIG=fbdev -DCMAKE_TOOLCHAIN_FILE=./toolchain-arm64.cmake
cmake --build build_arm64_fb -j$(nproc)

默认全屏显示,无需额外设置

编译完成后,在build_arm64_fb/bin/目录下生成的二进制文件lvglsim,可直接复制到arm64 Ubuntu 主机运行。

六、验证是否编译成功(可选)

进入LV_PORT_LINUX源码根目录,运行:

file ./build_arm64_sdl/bin/lvglsim 
# 或者运行
# file ./build_arm64_fb/bin/lvglsim

如果输出包含:

aarch64 GNU/Linux

则说明编译成功✅
在这里插入图片描述

七、在OrangePi Zero 2W上运行LVGL示例

目标平台操作系统为xfce_ubuntu(桌面版)

准备工作

  • 将开发平台和目标平台接入同一局域网内
  • 确定开发平台可以Ping通目标平台
  • 为开发平台和目标平台均安装对应版本的NoMachine软件

拷贝二进制文件

通过scp命令,将在开发平台编译生成的二进制文件lvglsim拷贝至目标平台。
例如,本例程中,为安装xfce_ubuntu的目标平台生成的二进制文件路径为lv_port_linu/build_arm64_sdl/bin/lvglsim,那么便进入LV_PORT_LINUX源码根目录,运行:

scp build_arm64_sdl/bin/lvglsim orangepi@192.168.xxx.xxx:/home/orangepi/Downloads

便可将二进制文件拷贝至目标OrangePi Zero 2W

在这里插入图片描述

运行示例

首先,使用 NoMachine 远程登录目标平台,然后,打开终端,并运行:

./Downloads/lvglsim

运行效果

lvgl_ubuntu_arm64_sdl

目标平台操作系统为server_ubuntu(服务器版)

准备工作

  • 确定开发平台可以Ping通目标平台

拷贝二进制文件

通过scp命令,将在开发平台编译生成的二进制文件lvglsim拷贝至目标平台。
例如,本例程中,为安装server_ubuntu的目标平台生成的二进制文件路径为lv_port_linu/build_arm64_fb/bin/lvglsim,那么便进入LV_PORT_LINUX源码根目录,运行:

scp build_arm64_fb/bin/lvglsim orangepi@192.168.xxx.xxx:/home/orangepi/Downloads

便可将二进制文件拷贝至目标OrangePi Zero 2W

运行示例

首先,通过 ssh 命令远程登录目标平台:
在这里插入图片描述
成功登入目标终端后,运行:

./Downloads/lvglsim

运行效果

lvgl_ubuntu_arm64_fbdev

总结

豆包真香!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐