使用Buildroot工具链编译LVGL并运行

LVGL Buildroot CMake Project

该文档记录了如何在 Buildroot 环境中交叉编译 LVGL 工程,包括 CMakeLists.txt 配置和工具链文件。

项目目录结构

project_root/
├── build/                        # 编译输出目录
├── lvgl/                         # LVGL 源码目录
├── lv_drivers/                  # LVGL 驱动目录
├── ui/                          # 自定义 UI 目录
├── main.c                       # 主程序入口
├── CMakeLists.txt               # 主 CMake 构建文件
└── toolchain-arm-buildroot.cmake # Buildroot 工具链文件

toolchain-arm-buildroot.cmake

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING true)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_LIBRARY_ARCHITECTURE arm-buildroot-linux-musleabi)
set(CMAKE_C_COMPILER ${CMAKE_LIBRARY_ARCHITECTURE}-gcc)
set(CMAKE_CXX_COMPILER ${CMAKE_LIBRARY_ARCHITECTURE}-g++)
set(CMAKE_LINKER ${CMAKE_LIBRARY_ARCHITECTURE}-ld)

CMakeLists.txt 示例

cmake_minimum_required(VERSION 3.15)
project(nanopi C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)

include_directories(
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_SOURCE_DIR}/lvgl
    ${PROJECT_SOURCE_DIR}/lv_drivers
    ${PROJECT_SOURCE_DIR}/ui
)

FILE(GLOB_RECURSE LVGL_Sources CONFIGURE_DEPENDS lvgl/*.c)
FILE(GLOB_RECURSE LV_DRIVERS_Sources CONFIGURE_DEPENDS lv_drivers/*.c)
FILE(GLOB_RECURSE UI_Sources CONFIGURE_DEPENDS ui/*.c ui/*.cpp)

add_executable(${PROJECT_NAME} main.c ${LVGL_Sources} ${LV_DRIVERS_Sources} ${UI_Sources})

构建命令

在构建目录中执行:

mkdir -p build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-arm-buildroot.cmake
make -j$(nproc)

常见问题

  • CMAKE_TOOLCHAIN_FILE 未生效:请确认 CMakeLists.txt 中未设置 project(...)toolchain 文件配置之前。
  • 编译器找不到:需保证 Buildroot 工具链位于环境变量 PATH 中或提供绝对路径。

其他拓展

  • 可加入 framebuffer 渲染支持,如 /dev/fb0 输出。
  • 若使用 SDL,需修改 include_directoriestarget_link_libraries

如果存以下问题:

  • 找不到正确的交叉编译器
  • 找不到 sysroot 和库
  • 链接失败或路径错误

可以对 CMakeLists.txt 的改进。


改法:使用工具链文件 + 干净的 CMakeLists.txt

🔧 第一步:创建工具链文件(例如 toolchain-buildroot.cmake

# toolchain-buildroot.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(TOOLCHAIN_PREFIX arm-buildroot-linux-musleabi)
set(TOOLCHAIN_DIR /path/to/buildroot/output/host)

set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_SYSROOT ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}/sysroot)

set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

🔁 替换 /path/to/buildroot 为实际 Buildroot 路径。


🛠️ 第二步:简化 CMakeLists.txt

你的工程 CMakeLists.txt 可以像这样:

cmake_minimum_required(VERSION 3.15)

project(nanopi C CXX)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)

include_directories(
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_SOURCE_DIR}/lvgl
    ${PROJECT_SOURCE_DIR}/lv_drivers
    ${PROJECT_SOURCE_DIR}/ui
)

file(GLOB_RECURSE LVGL_SOURCES CONFIGURE_DEPENDS lvgl/*.c)
file(GLOB_RECURSE DRIVER_SOURCES CONFIGURE_DEPENDS lv_drivers/*.c)
file(GLOB_RECURSE UI_SOURCES CONFIGURE_DEPENDS ui/*.c ui/*.cpp)

add_executable(${PROJECT_NAME}
    main.c
    ${LVGL_SOURCES}
    ${DRIVER_SOURCES}
    ${UI_SOURCES}
)

🧪 第三步:配置构建命令

mkdir build
cd build

cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-buildroot.cmake
make

🧠 如果非要用 set(CMAKE_C_COMPILER ...) 直接设置:

必须提前导出环境变量或写全路径,否则 CMake 可能无法正确识别工具链:

set(CMAKE_C_COMPILER /path/to/buildroot/output/host/bin/arm-buildroot-linux-musleabi-gcc)

并补充:

set(CMAKE_SYSROOT /path/to/buildroot/output/host/arm-buildroot-linux-musleabi/sysroot)

但这样方式容易出错,不如用 toolchain 文件更可控、清晰。


LVGL Buildroot CMake Project

该文档记录了如何在 Buildroot 环境中交叉编译 LVGL 工程,包括 CMakeLists.txt 配置和工具链文件。

项目目录结构

project_root/
├── build/                        # 编译输出目录
├── lvgl/                         # LVGL 源码目录
├── lv_drivers/                  # LVGL 驱动目录
├── ui/                          # 自定义 UI 目录
├── main.c                       # 主程序入口
├── CMakeLists.txt               # 主 CMake 构建文件
└── toolchain-arm-buildroot.cmake # Buildroot 工具链文件

toolchain-arm-buildroot.cmake

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING true)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_LIBRARY_ARCHITECTURE arm-buildroot-linux-musleabi)
set(CMAKE_C_COMPILER ${CMAKE_LIBRARY_ARCHITECTURE}-gcc)
set(CMAKE_CXX_COMPILER ${CMAKE_LIBRARY_ARCHITECTURE}-g++)
set(CMAKE_LINKER ${CMAKE_LIBRARY_ARCHITECTURE}-ld)

CMakeLists.txt 示例

cmake_minimum_required(VERSION 3.15)
project(nanopi C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)

include_directories(
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_SOURCE_DIR}/lvgl
    ${PROJECT_SOURCE_DIR}/lv_drivers
    ${PROJECT_SOURCE_DIR}/ui
)

FILE(GLOB_RECURSE LVGL_Sources CONFIGURE_DEPENDS lvgl/*.c)
FILE(GLOB_RECURSE LV_DRIVERS_Sources CONFIGURE_DEPENDS lv_drivers/*.c)
FILE(GLOB_RECURSE UI_Sources CONFIGURE_DEPENDS ui/*.c ui/*.cpp)

add_executable(${PROJECT_NAME} main.c ${LVGL_Sources} ${LV_DRIVERS_Sources} ${UI_Sources})

构建命令

在构建目录中执行:

mkdir -p build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-arm-buildroot.cmake
make -j$(nproc)

常见问题

  • CMAKE_TOOLCHAIN_FILE 未生效:请确认 CMakeLists.txt 中未设置 project(...)toolchain 文件配置之前。
  • 编译器找不到:需保证 Buildroot 工具链位于环境变量 PATH 中或提供绝对路径。

其他拓展

  • 可加入 framebuffer 渲染支持,如 /dev/fb0 输出。
  • 若使用 SDL,需修改 include_directoriestarget_link_libraries

如果存以下问题:

  • 找不到正确的交叉编译器
  • 找不到 sysroot 和库
  • 链接失败或路径错误

可以对 CMakeLists.txt 的改进。


改法:使用工具链文件 + 干净的 CMakeLists.txt

🔧 第一步:创建工具链文件(例如 toolchain-buildroot.cmake

# toolchain-buildroot.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(TOOLCHAIN_PREFIX arm-buildroot-linux-musleabi)
set(TOOLCHAIN_DIR /path/to/buildroot/output/host)

set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_SYSROOT ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}/sysroot)

set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

🔁 替换 /path/to/buildroot 为实际 Buildroot 路径。


🛠️ 第二步:简化 CMakeLists.txt

你的工程 CMakeLists.txt 可以像这样:

cmake_minimum_required(VERSION 3.15)

project(nanopi C CXX)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)

include_directories(
    ${PROJECT_SOURCE_DIR}
    ${PROJECT_SOURCE_DIR}/lvgl
    ${PROJECT_SOURCE_DIR}/lv_drivers
    ${PROJECT_SOURCE_DIR}/ui
)

file(GLOB_RECURSE LVGL_SOURCES CONFIGURE_DEPENDS lvgl/*.c)
file(GLOB_RECURSE DRIVER_SOURCES CONFIGURE_DEPENDS lv_drivers/*.c)
file(GLOB_RECURSE UI_SOURCES CONFIGURE_DEPENDS ui/*.c ui/*.cpp)

add_executable(${PROJECT_NAME}
    main.c
    ${LVGL_SOURCES}
    ${DRIVER_SOURCES}
    ${UI_SOURCES}
)

🧪 第三步:配置构建命令

mkdir build
cd build

cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-buildroot.cmake
make

🧠 如果非要用 set(CMAKE_C_COMPILER ...) 直接设置:

必须提前导出环境变量或写全路径,否则 CMake 可能无法正确识别工具链:

set(CMAKE_C_COMPILER /path/to/buildroot/output/host/bin/arm-buildroot-linux-musleabi-gcc)

并补充:

set(CMAKE_SYSROOT /path/to/buildroot/output/host/arm-buildroot-linux-musleabi/sysroot)

但这样方式容易出错,不如用 toolchain 文件更可控、清晰。


运行生成的 lvgl 应用

你可以通过在 /etc/init.d/ 中创建一个脚本,使系统在启动时自动运行 /root/nanopi 可执行文件。以下是一个完整可用的 init.d 脚本及安装方式说明,适用于大多数基于 BusyBox 或 Buildroot 的系统。


✅ 脚本内容(命名为 /etc/init.d/nanopi

#!/bin/sh

### BEGIN INIT INFO
# Provides:          nanopi
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     S
# Default-Stop:
# Short-Description: Start nanopi app at boot
### END INIT INFO

DAEMON="/root/nanopi"
PIDFILE="/var/run/nanopi.pid"

start() {
    echo "Starting nanopi..."
    if [ -x "$DAEMON" ]; then
        $DAEMON &
        echo $! > "$PIDFILE"
        echo "nanopi started with PID $(cat $PIDFILE)"
    else
        echo "Executable $DAEMON not found!"
    fi
}

stop() {
    echo "Stopping nanopi..."
    if [ -f "$PIDFILE" ]; then
        kill "$(cat "$PIDFILE")"
        rm -f "$PIDFILE"
        echo "nanopi stopped"
    else
        echo "PID file not found. Is nanopi running?"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

exit 0

✅ 安装步骤

  1. 保存脚本到 /etc/init.d/nanopi

    vi /etc/init.d/nanopi
    # 粘贴上述脚本内容
    
  2. 赋予执行权限

    chmod +x /etc/init.d/nanopi
    
  3. 添加为开机启动项
    如果是标准的 SysV init 系统:

    ln -s /etc/init.d/nanopi /etc/rcS.d/S99nanopi
    

    这里 S99 代表启动顺序,99 表示比较靠后启动。


🔍 检查方法

  • 测试运行:

    /etc/init.d/nanopi start
    
  • 查看是否已启动:

    ps | grep nanopi
    
  • 查看是否会随系统启动:
    重启系统后确认进程是否在运行。


如你使用的是 systemd,而不是 init.d,需要制作 systemd 的版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值