新手上路
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2022-1-20
- 在线时间
- 2 小时
|
最近刚开始学习linux arm 的QT开发,用的正点原子自带的工程,编译报错同时有警报如图一,显示 undefined reference to `lcd_drawpoint',这个是正点原子的画点函数。经差错好像是因为inline unsigned int lcd_readpoint(unsigned short x, unsigned short y)。这个函数定义的时候用了inline,
百度一下他的用法:
1.inline定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换(像宏一样展开),没有了调用的开销,效率也很高。
2.很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
3.inline可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。
图一
因为只是想点亮工程测试代码目前并不需要优化,所以第二次尝试直接吧inline删除,编译没有错误,但是函数运行会卡死。led不闪烁,显示器背景色也不会1000ms刷新,于是调用串口输出查询代码卡在哪了,测试发现卡在了图片二的267行的位置。
运行能进入lcd_show_string函数的 while里面,但是会卡死在lcd_showchar的前面,不知道为什么进不去这个函数。本人用的也是ubuntu64位的虚拟机。开始怀疑是代码优化的问题于是吧Makefile 里面的 -O2删除,发现没有作用,还是卡死,除非删除main()里面的lcd_show_string函数,程序才不会卡死
图片二
百度了一下原因,感觉没有找到和我出现类似错误的,我怀疑是不是我的gcc编译器有问题就查询了一下版本,gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 是9.03版本,我看左神用的是4.9.3的版本,不知道是否跟版本有关?
为了解决这个问题,尝试在makefile中使用-O优化函数,不起作用
最终是在inline的前面重新声明了非inline的原型函数才解决问题。如图三
图三,
重新编译错误消失,同时运行时候也不会卡死了屏幕能刷新颜色同时显示版本号等字符串了。
不知有没有人有类似的错,有大佬能大概帮我分析一下原因吗
|
|