在VSCode中仿真LVGL问题记录
·
合并官方例程后需要注意的点
1.找到VScode中的CMakeLists.txt文件添加之前安装的SDL路径,具体操作如下
# Set the output path for the executable
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
# 指定SDL配置路径
set(CMAKE_PREFIX_PATH "${PROJECT_SOURCE_DIR}D:/VScode/SDL2-2.32.4/x86_64-w64-mingw32" ${CMAKE_PREFIX_PATH})
file(COPY "D:/VScode/mingw/mingw64/x86_64-w64-mingw32/bin/SDL2.dll" DESTINATION ${PROJECT_SOURCE_DIR}/bin)
# Find and include SDL2 library
find_package(SDL2 REQUIRED)
2.simulator.code-workspace文件中miDebuggerPath的gdb.exe改为自己的安装路径
"windows": {
"MIMode": "gdb",
"miDebuggerPath": "D:\\VScode\\mingw\\mingw64\\bin\\gdb.exe"
}
3.main.c中添加SDK的头文件
//注释掉#include "glob.h",并添加SDL头文件
//#include "glob.h"
//添加SDL头文件
#include "SDL2/SDL.h"
4.我使用的CMake及gcc版本分别为
cmake version 4.3.3
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
lv_port_pc_vscode-release-v9.5 //主文件版本
FreeRTOS-Kernel-11.2.0 //FreeRTOS操作系统文件
lvgl-release-v9.5 //LVGL库文件
5.直接编译出现的问题及解决办法
直接编译后会出现'PRIu32'报错,这个错误是 C++ 代码中使用了 C99 的格式化宏 PRIu32,但对应的宏定义未被启用导致的。
LVGL/lv_port_pc_vscode-release-v9.5_1/lvgl/src/libs/thorvg/tvgInitializer.cpp",
"owner": "cmake-build-diags",
"severity": 8,
"message": "expected ')' before 'PRIu32'",
"source": "cmake GCC",
"startLineNumber": 77,
"startColumn": 35,
"endLineNumber": 77,
"endColumn": 1000,
"origin": "extHost1"
}]
解决方案1,在LVGL文件下的CMakeList.txt文件中添加
cmake_minimum_required(VERSION 3.12.4)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
if(NOT ESP_PLATFORM)
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_LIST_DIR)
project(
lvgl
LANGUAGES C
HOMEPAGE_URL https://github.com/lvgl/lvgl)
endif()
if(NOT (CMAKE_C_COMPILER_ID STREQUAL "MSVC"))
enable_language(CXX ASM)
else()
enable_language(CXX)
endif()
endif()
set(LVGL_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR})
if(ESP_PLATFORM)
include(${CMAKE_CURRENT_LIST_DIR}/env_support/cmake/esp.cmake)
elseif(MICROPY_DIR)
include(${CMAKE_CURRENT_LIST_DIR}/env_support/cmake/micropython.cmake)
else()
include(${CMAKE_CURRENT_LIST_DIR}/env_support/cmake/os_desktop.cmake)
endif()
#新添加
add_definitions(-D__STDC_FORMAT_MACROS)
#[[
unfortunately CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS does not work for global data.
for global data we still need decl specs.
Check out the docs to learn more about the limitations of CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
https://cmake.org/cmake/help/latest/prop_tgt/WINDOWS_EXPORT_ALL_SYMBOLS.html#prop_tgt:WINDOWS_EXPORT_ALL_SYMBOLS
For all compiled sources within the library (i.e. basically all lvgl files) we need to use dllexport.
For all compiled sources from outside the library (i.e. files which include lvgl headers) we need to use dllimport.
We can do this by using CMakes INTERFACE and PRIVATE keyword.
]]
if(MSVC AND BUILD_SHARED_LIBS)
target_compile_definitions(
lvgl
INTERFACE "LV_ATTRIBUTE_EXTERN_DATA=__declspec(dllimport)"
PRIVATE "LV_ATTRIBUTE_EXTERN_DATA=__declspec(dllexport)")
endif()
如果修改后直接编译会出现三种报错,同样是Mingw环境兼容性问题:LVGL 的 SDL 驱动直接使用了微软的扩展函数 _aligned_malloc / _aligned_free,但在 MinGW GCC 下这些函数没有被正确声明,从而引发一连串编译错误。
lv_sdl_sw.c 中使用了 Windows 特有的 _aligned_malloc 和 _aligned_free,它们通常在 <malloc.h> 中声明。
在 MinGW 环境下:
-
如果没有显式
#include <malloc.h>,编译器就会认为这些函数是隐式声明,默认返回int。 -
当把
int赋值给void *时,就会触发-Wint-conversion错误(或严格模式下直接报错)。 -
其实这三个错误是同一原因引起的:缺少头文件导致声明缺失。
[{
"resource": "/E:LVGL/lv_port_pc_vscode-release-v9.5_1/lvgl/src/drivers/sdl/lv_sdl_sw.c",
"owner": "cmake-build-diags",
"severity": 8,
"message": "implicit declaration of function '_aligned_malloc'; did you mean '_aligned_realloc'? [-Wimplicit-function-declaration]",
"source": "cmake GCC",
"startLineNumber": 239,
"startColumn": 12,
"endLineNumber": 239,
"endColumn": 1000,
"modelVersionId": 1,
"origin": "extHost1"
}][{
"resource": "/E:lv_port_pc_vscode-release-v9.5_1/lvgl/src/drivers/sdl/lv_sdl_sw.c",
"owner": "cmake-build-diags",
"severity": 8,
"message": "returning 'int' from a function with return type 'void *' makes pointer from integer without a cast [-Wint-conversion]",
"source": "cmake GCC",
"startLineNumber": 239,
"startColumn": 12,
"endLineNumber": 239,
"endColumn": 1000,
"modelVersionId": 1,
"origin": "extHost1"
}][{
"resource": "/E:LVGL/lv_port_pc_vscode-release-v9.5_1/lvgl/src/drivers/sdl/lv_sdl_sw.c",
"owner": "cmake-build-diags",
"severity": 8,
"message": "implicit declaration of function '_aligned_free'; did you mean '_aligned_realloc'? [-Wimplicit-function-declaration]",
"source": "cmake GCC",
"startLineNumber": 248,
"startColumn": 5,
"endLineNumber": 248,
"endColumn": 1000,
"modelVersionId": 1,
"origin": "extHost1"
}],
解决方案之一在lv_port_pc_vscode-release-v9.5_1/lvgl/src/drivers/sdl/lv_sdl_sw.c文件上方添加
/**
* @file lv_sdl_sw.c
*
*/
/*********************
* INCLUDES
*********************/
/* for aligned_alloc */
#ifdef __MINGW32__
#include <malloc.h> // for _aligned_malloc, _aligned_free
#endif
保存后重新编译错误消失,可以正常仿真

更多推荐


所有评论(0)