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_directories和target_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_directories和target_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
✅ 安装步骤
-
保存脚本到
/etc/init.d/nanopivi /etc/init.d/nanopi # 粘贴上述脚本内容 -
赋予执行权限
chmod +x /etc/init.d/nanopi -
添加为开机启动项
如果是标准的 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 的版本。



4092

被折叠的 条评论
为什么被折叠?



