嵌入式技术论坛
直播中

杨秀英

7年用户 1402经验值
私信 关注
[问答]

RT-Thread studio编译出现undefined reference to警告怎么解决?

我希望使用lvgl里的demo,将demos文件添加构建,但是出现了undefined reference to xxx的错误,以及warning: implicit declaration of function ‘lv_demo_music’警告
2.jpg
lv_demo_music是lvgl官方的music例程中的函数,用于启动这个例程。
2.jpg
我将声明lv_demo_music的头文件include进来了,同时确认了lv_demo_music函数所在的lv_demo_music.c源文件被包含进项目资源管理器并且参与构建
2.jpg
同时,我也确认了lv_demo_music.c确实生成了lv_demo_music.o文件
2.jpg
但是为什么在编译时会产生undefined reference to xxx的错误以及 implicit declaration of function 警告呢?这个问题应该怎么解决?

回帖(6)

张英

2023-4-4 14:25:47
有个比较笨的方法:在lv_demo_music函数内添加 #error “xxxxx”,编译的时候看是否显示出来,检查lv_demo_music函数是不是真的参与编译了,然后进一步分析。
举报

杨秀英

2023-4-4 14:25:55
2.jpg
在源文件lv_demo_music.c中加入了#error “xxx”但是编译时却没有弹出错误#error “xxx”,看起来像是没有被编译进去。
但是在编译的命令行中却有这个文件,而且确实生成了.o文件,请问这是什么情况? 3.jpg
举报

张英

2023-4-4 14:26:06
2.jpg
请确认这个宏控是否打开? 没打开的话,下面的逻辑都没参与编译。另外我查看发现其他的.c文件也用到了这个宏,你需要确认下正确打开此宏控的方法。
举报

杨秀英

2023-4-4 14:26:14
可以确认是宏定义的问题现在,当我注释了宏定义用#if 1代替以后出现不同的报错,应该是未注释前宏定义导致没有编译条件编译导致的
2.jpg
但是这种情况更加令人疑惑,studio里面显示宏展开结果为1

2.jpg
头文件的关系是这样的
lv_demo_music.c —- lv_demo_music.h —- lv_conf.h,在lv_conf.h中包含了LV_USE_DEMO_MUSIC这个宏,并且已经打开

2.jpg
但是似乎源文件就是编译不进去








举报

张英

2023-4-4 14:26:23
你这种情况,大概率是因为LV_USE_DEMO_MUSIC宏,并没有在整个工程里被声明。
这种情况有两种解决方案:
1.在一个通用头文件里添加 #define LV_USE_DEMO_MUSIC 1, 你在lv_conf.h里添加,有可能别的.c文件并没有包含到你的lv_conf.h,你可以自行分析下哪些头文件里是通用的。
2.gcc编译器在编译的时候,可以通过添加 -DLV_USE_DEMO_MUSIC=1 编译条件,保证全局通用。 你可以查阅下studio编译工具有没有类似的方法,我记得gcc、keil都是有的。
举报

杨秀英

2023-4-4 14:26:37
通过添加编译条件解决了这个问题,问题产生的原因也搞清楚了一部分。
2.jpg
在lv_conf.h中加入了#error “xxx”发现最终文件也被编译成功,意味着lv_cong.h根本没有参与到文件的编译中来。这个问题我怀疑是一些编译设置导致的。
可能在rtthread中,根本不需要lv_conf的设置,这个我后续会更加深入了解
举报

更多回帖

发帖
×
20
完善资料,
赚取积分