联盛德W801系列8-编译链接时找不到标准数学库函数的解决方法

之前的笔记《联盛德W801系列4-MQTT使用》出现过编译《cjson.c》出错,找不到标准数学函数pow(幂函数,在转换科学记数法表示的字符串用到),floor(浮点取整函数),当时因为没有用到这些功能,就直接注释相关报错行,但求能通过编译,没有去解决根本问题。
昨天在移植GUI源码,用到三角函数,又出现这个错误,就到联盛德问答社区提问。
我的问题页面:http://ask.winnermicro.com/question/325.html
5分钟内立刻有专家帮我解答。因为有其他网友之前提过类似的问题:http://ask.winnermicro.com/question/291.html
这次有点空闲时间,我就找一下相关知识看看,补补欠缺,并做笔记。
先来看看问题的表象。

1.问题的出现和解决

尽管已经包含了 <math.h>,链接时找不到pow和floor函数。
在这里插入图片描述
在这里插入图片描述
解决方法:

1.通过下面的方法进入工程设置:
在这里插入图片描述
2.在 linker页面的 Library Name增加m,用分号隔开。再次编译就可以正常使用数学 函数。
在这里插入图片描述

CDK默认库目录下面有这些库:
在这里插入图片描述

2. gcc -l 参数说明

这里的-l是L的小写。
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是 libm.a,很容易看出,把库文件名的头lib和尾.a去掉就是库名了。cdk默认库的目录是 《$(CDKPath)/CSKY/MinGW/csky-abiv2-elf-toolchain/csky-elfabiv2/lib》
看到这里,就知道怎么为何增加m就可以解决问题。下面再扩展一下。
当我们自已要用到一个第三方提供的库名字libtest.a,那么我们只要把libtest.a拷贝到默认库的目录里,编译时加上-ltest参数,我们就能用上libtest.a库了(当然要用libtest.a库里的函数,我们还需要与libtest.a配套的头文件);但如果库文件没放在这个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/bin/ld: cannot find -lxxx”,也就是链接程序ld在这个目录里找不到libxxx.a,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.a放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest。

3.又有错误undefined reference to `__cxa_guard_acquire’

错误现象:
在这里插入图片描述

《UIcode.cpp》是c++文件,函数内部的静态局部变量的初始化是在函数第一次调用时执行,编译器会用函数__cxa_guard_acquire; 用来保证在之后的调用中不会对其重复初始化。这个函数存在于libstdc++库里面,这个库还是编译器自带的,只要在我们的工程中增加-lstdc++就可以了。那我们依照增加数学函数库的方法来解决问题。

在这里插入图片描述
保存,重新编译。编译成功。功能正常。

附录:参考资料:

  1. gcc -I -L -l区别
  2. 联盛德问答社区的相关页面:http://ask.winnermicro.com/question/291.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值