重要参考:解决:Target "XXX" INTERFACE_INCLUDE_DIRECTORIES property contains path
一、报错信息
本文旨在解决在 Windows 环境下编译 LVGL PC 模拟器项目时遇到的 CMake INTERFACE_INCLUDE_DIRECTORIES 路径报错问题。通过分析报错根源,并提供清晰的修复步骤,帮助开发者快速恢复编译流程。
编译 LVGL PC VSCode 模拟器项目时,CMake 核心报错:
Target "lvgl" INTERFACE_INCLUDE_DIRECTORIES property contains path:
"D:/.Desktop/lvgl_dev/lvgl/lv_port_pc_vscode-master" which is prefixed in the source directory.
二、报错根源定位(分析)
LVGL 内核代码无问题
lvgl 源码 main.cmake 中,官方对自身头文件路径已做规范处理,全部使用 $<BUILD_INTERFACE> 区分构建/安装路径,完全符合 CMake 语法规范,不会触发报错。
# 官方合规代码,无需修改
target_include_directories(lvgl SYSTEM PUBLIC
$<BUILD_INTERFACE:${LVGL_ROOT_DIR}>
$<BUILD_INTERFACE:${LVGL_INCLUDE_DIR}>
$<BUILD_INTERFACE:${CONF_INC_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
报错真正诱因:上层 PORT 工程
lv_port_pc_vscode-master/CMakeLists.txt 中,直接给 lvgl 目标添加了裸绝对路径(项目根目录、SDL2 依赖目录),未包裹 $<BUILD_INTERFACE> 生成器表达式。
报错触发必要条件
- lvgl 目标的
INTERFACE_INCLUDE_DIRECTORIES存在未规范处理的源码绝对路径; - lvgl 源码
main.cmake末尾存在install(EXPORT lvglTargets)库导出逻辑,CMake 强制路径校验失败。
三、修复方案
Windows 本地模拟器仅用于调试运行,无需编译安装、导出库文件,直接禁用 LVGL 所有安装导出逻辑。
1. 代码修改操作
打开 lvgl/env_support/cmake/main.cmake 文件,全量注释文件末尾的完整 INSTALLATION 代码块:
注释范围:从 ############################## INSTALLATION ###################################### 开始,到所有安装、导出、打包代码全部结束。
保留最后的 ############################## SET GLOBAL VARIABLES ###################################### 变量定义代码。
############################## INSTALLATION ######################################
# 全部注释以下所有代码
# Install public headers
# install(
# DIRECTORY "${LVGL_ROOT_DIR}/include/lvgl"
# DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
#
# # Install private headers only if required
# if(CONFIG_LV_USE_PRIVATE_API)
# install(
# DIRECTORY "${LVGL_ROOT_DIR}/src/"
# DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/lvgl_private"
# FILES_MATCHING PATTERN "*.h"
# )
# ...
# endif()
#
# # Generate and install CMake config files
# include(CMakePackageConfigHelpers)
# configure_package_config_file(...)
# write_basic_package_version_file(...)
# install(FILES ...)
# install(TARGETS lvgl EXPORT lvglTargets ...)
# install(EXPORT lvglTargets ...)
# # thorvg / demos / examples 所有安装导出代码
# ...
############################## SET GLOBAL VARIABLES ######################################
# 此段代码保留,不注释
2. 工程重置 & 编译步骤
清理旧编译缓存,避免残留配置报错:
方式一:命令清理
cd D:/.Desktop/lvgl_dev/lvgl/lv_port_pc_vscode-master
rmdir /s /q build
方式二:手动清理(命令报错时使用)
直接打开项目目录,手动删除 build 整个文件夹即可。
3. 重新编译运行
VSCode 直接执行 Run 编译,正常编译成功日志如下:
[main] 正在生成文件夹: build all
[build] 正在启动生成
[proc] 正在执行命令: cmake --build ... --config Debug --target all -j 32 --
[build] [ 5%] Built target lvgl_thorvg
[build] [ 56%] Built target lvgl
[build] [ 65%] Built target lvgl_demos
[build] [ 99%] Built target lvgl_examples
[build] [100%] Built target main
[driver] 生成完毕: 00:00:03.903
[build] 生成已完成,退出代码为 0
退出代码为 0,代表编译成功,可正常运行 LVGL 模拟器。
总结
这个报错不是 LVGL 源码本身的问题,官方源码的路径写法是完全规范的。真正原因就两点:
- PC 模拟器工程(port 层 CMake)直接裸写了 SDL2 和项目根目录的绝对路径,没有用构建表达式包裹;
- LVGL 底层打开了库安装导出功能,CMake 一旦检测到公开头文件路径里有源码绝对路径,就直接报错阻止编译。
针对 Windows 本地模拟器调试的场景,直接打开 lvgl 的 main.cmake,把文件末尾一整块 INSTALL 安装、EXPORT 导出代码全部注释掉,只保留最后的全局变量部分。然后删掉旧的 build 缓存文件夹,重新编译即可。