文章目录
- 前言
- 一、开发环境说明
- 二、下载LVGL源码
- 三、安装交叉编译环境
- 安装 arm64 编译器 + 所有依赖
- 常见问题
- 第一步:添加 arm64 架构到系统(必须)
- 第二步:修复 apt 源(关键!否则依然找不到包)
- 第三步:再次更新并安装
- 第四步:安装交叉编译器
- 四、CMake 交叉编译脚本
- 五、编译
- 目标平台操作系统为xfce_ubuntu(桌面版)
- 目标平台操作系统为server_ubuntu(服务器版)
- 六、验证是否编译成功(可选)
- 七、在OrangePi Zero 2W上运行LVGL示例
- 目标平台操作系统为xfce_ubuntu(桌面版)
- 准备工作
- 拷贝二进制文件
- 运行示例
- 运行效果
- 目标平台操作系统为server_ubuntu(服务器版)
- 准备工作
- 拷贝二进制文件
- 运行示例
- 运行效果
- 总结
前言
本文主题:如何在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源码
gitclone https://github.com/lvgl/lv_port_linux.gitcdlv_port_linux/gitsubmodule update--init--recursive三、安装交叉编译环境
安装 arm64 编译器 + 所有依赖
在amd64 Ubuntu开发平台中安装arm64编译器 + 所有依赖
sudoaptupdate# 安装交叉编译器sudoaptinstallgcc-aarch64-linux-gnu g++-aarch64-linux-gnu# 安装 arm64 版本的 SDL2 ,EVDEV开发库sudoaptinstalllibsdl2-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 架构到系统(必须)
sudodpkg --add-architecture arm64sudoaptupdate第二步:修复 apt 源(关键!否则依然找不到包)
Ubuntu默认源不支持跨架构下载,必须修改sources.list。
自动修复命令(直接复制运行)
sudosed-i's/^deb http/deb [arch=amd64,i386] http/g'/etc/apt/sources.listsudosed-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"|sudotee/etc/apt/sources.list.d/arm64.list第三步:再次更新并安装
sudoaptupdatesudoaptinstalllibsdl2-dev:arm64 libsdl2-image-dev:arm64 libevdev-dev:arm64第四步:安装交叉编译器
sudoaptinstallgcc-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-Bbuild_arm64_sdl-DCONFIG=sdl-DCMAKE_TOOLCHAIN_FILE=./toolchain-arm64.cmake cmake--buildbuild_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-Bbuild_arm64_fb-DCONFIG=fbdev-DCMAKE_TOOLCHAIN_FILE=./toolchain-arm64.cmake cmake--buildbuild_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源码根目录,运行:
scpbuild_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源码根目录,运行:
scpbuild_arm64_fb/bin/lvglsim orangepi@192.168.xxx.xxx:/home/orangepi/Downloads便可将二进制文件拷贝至目标OrangePi Zero 2W。
运行示例
首先,通过 ssh 命令远程登录目标平台:
成功登入目标终端后,运行:
./Downloads/lvglsim运行效果
lvgl_ubuntu_arm64_fbdev
总结
豆包真香!