[STM32F1] 已添加头文件,同一个函数不同错误提示

[复制链接]
51|20
Hitomi22 发表于 2026-2-16 09:31 | 显示全部楼层 |阅读模式
我遇到了一个错误,快把我逼疯了,同一个函数lv_disp_get_default()第一次调用时完全正常,但第二次使用时却被标记为错误undefined reference to lv_disp_get_default
static inline struct _lv_obj_t * lv_layer_top(void)
{
    return lv_disp_get_layer_top(lv_disp_get_default());
}

static inline struct _lv_obj_t * lv_scr_act(void)
{
    return lv_disp_get_scr_act(lv_disp_get_default()); <---- Error here
}
为什么第一个lv_disp_get_default()没问题,第二个却触发错误?
这段代码位于lv_disp.h文件中,而lv_disp_get_default()函数是在lv_disp.c文件中定义的,定义代码如下:
lv_disp_t * lv_disp_get_default(void)

{

return disp_def;

}


公羊子丹 发表于 2026-2-16 11:11 | 显示全部楼层
我怀疑是头文件里的内联函数搞的鬼,lv_disp.h里这两个都是static inline,编译器可能对第二个函数的解析出了问题,你试试把lv_disp.c里的函数声明也加上static,或者把内联函数的static去掉再编译看看?
周半梅 发表于 2026-2-16 11:11 | 显示全部楼层
这问题我之前碰过类似的,大概率是编译链接的问题,你检查下lv_disp.c这个文件有没有被正确加入到工程的编译列表里,是不是不小心被排除了,或者编译的时候这个文件的生成目标和你调用的地方不匹配?
帛灿灿 发表于 2026-2-16 11:12 | 显示全部楼层
兄弟你这情况太离谱了,同一个函数两次调用一个好一个错,我建议你先清理下工程的编译缓存,把obj、bin这些文件夹全删了重新编译,有时候编译器的缓存残留就会出这种莫名其妙的未定义引用错误。
童雨竹 发表于 2026-2-16 11:13 | 显示全部楼层
会不会是函数声明的问题啊?你看下lv_disp.h里有没有正确声明lv_disp_get_default(),是不是漏了extern,或者声明的返回值类型和lv_disp.c里的定义不一致,哪怕一点点差异链接器都不认的。
万图 发表于 2026-2-16 11:14 | 显示全部楼层
这问题挺常见的,尤其是在LVGL里用内联函数的时候,你试试把这两个内联函数挪到lv_disp.c里去定义,头文件只留声明,static inline在头文件里多次引用容易出链接问题,亲测有效。
Wordsworth 发表于 2026-2-16 11:15 | 显示全部楼层
我猜是不是编译器的优化等级搞的事,你看看工程里的编译优化选项,是不是开了-O2或者更高的优化,把优化等级调低到-O0试试,有时候高优化会让编译器对inline函数做奇怪的处理,导致链接找不到定义。
Bblythe 发表于 2026-2-16 11:16 | 显示全部楼层
你检查下lv_disp.h的包含方式啊,是不是用了#ifndef的头文件保护,有没有可能某个地方重复包含了,或者在第二个函数调用前,头文件的定义被宏给屏蔽了,导致编译器没识别到函数声明?
Pulitzer 发表于 2026-2-16 11:19 | 显示全部楼层
兄弟快别疯了,我给你个笨办法排查,你在lv_disp_get_default()函数里加个打印语句,再在两个调用的地方也加打印,看看编译的时候哪个环节报的错,是不是第二个调用的地方根本没读到函数的定义?
Uriah 发表于 2026-2-16 11:20 | 显示全部楼层
会不会是LVGL的配置问题啊?你看下lv_conf.h里的相关宏,是不是开启了什么显示相关的配置项,导致第二个函数调用的时候,lv_disp_get_default()的定义被条件编译给屏蔽了,第一个却刚好没受影响?
Clyde011 发表于 2026-2-16 11:21 | 显示全部楼层
我之前用STM32写LVGL也遇过未定义引用,大概率是链接脚本的问题,你检查下链接脚本里的段分配,是不是lv_disp.c编译后的代码没被放到正确的代码段里,导致链接的时候找不到这个函数的实体?
qintian0303 发表于 2026-2-17 11:21 | 显示全部楼层
也可能是引用路径的问题,第一次加入的时候没有问题,但是IDE中的文件的打开第二次打开可能就不是这个了
solty 发表于 2026-2-17 12:26 | 显示全部楼层
可能是构建系统配置缺失,lv_disp.c未被正确编译或链接到项目中。LVGL采用模块化设计,需显式将源文件加入构建系统
classroom 发表于 2026-2-17 12:26 | 显示全部楼层
链接器符号冲突?多次调用同一函数时,若符号未正确解析,链接器可能因重复定义或顺序错误报错。
classroom 发表于 2026-2-17 12:27 | 显示全部楼层
宏定义配置可能有问题
cr315 发表于 2026-2-17 12:28 | 显示全部楼层
清理并重新构建吧
duo点 发表于 2026-2-17 12:28 | 显示全部楼层
lv_disp.h在调用处是否被正确包含
flycamelaaa 发表于 2026-2-17 12:30 | 显示全部楼层
可能头文件中的内联函数没有正确声明为static inline,或者存在重复定义的问题。
jcky001 发表于 2026-2-17 12:30 | 显示全部楼层
lv_disp_get_default()函数的实现可能没有在链接时被正确包含,导致第二个调用时找不到定义。
solty 发表于 2026-2-17 14:52 | 显示全部楼层
检查头文件中的函数声明是否正确,特别是返回类型和参数是否匹配。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

107

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0