鱼C论坛

 找回密码
 立即注册
查看: 3707|回复: 15

[已解决]怎么看都没有问题,到底为什么呀?pow未定义的应用

[复制链接]
发表于 2022-11-1 19:23:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个明明对了3,4遍了,每个字母都看过去了,但是,还是不对实验了一下,是i的问题,把i换成数字就没问题。为什么会这样啊?
最佳答案
2022-11-1 19:37:31
御坂19090 发表于 2022-11-1 19:33
成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?

当然不是,这里处理的是链接器链接的问题
由于原先编译系统不知道要链接这个库(数学库)因此引用 pow 函数的时候出现了链接错误
可以看看 man pow
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-1 19:41:00 | 显示全部楼层
-lm对应的是 /lib/libm.so
就是前面去掉lib后面去掉.so剩下的
举个例子
#include <mpfr.h>
编译的时候要加 -lmpfr
对应的文件是 /lib/libmpfr.so
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2022-11-1 20:02:17 | 显示全部楼层
御坂19090 发表于 2022-11-1 19:55
对了,突然想起来,好像pow(这里面全部都是数字的话,不需要-lm也可以使用呀?这个有什么区别吗?)
  1. int main(void) {
  2.     1179:       55                      pushq  %rbp
  3.     117a:       48 89 e5                movq   %rsp,%rbp
  4.     printf("%f\n", pow(2, 3));
  5.     117d:       48 8b 05 3c 0f 00 00    movq   0xf3c(%rip),%rax        # 20c0 <_IO_stdin_used+0xc0>
  6.     1184:       66 48 0f 6e c0          movq   %rax,%xmm0
  7.     1189:       48 8d 05 90 0e 00 00    leaq   0xe90(%rip),%rax        # 2020 <_IO_stdin_used+0x20>
  8.     1190:       48 89 c7                movq   %rax,%rdi
  9.     1193:       b8 01 00 00 00          movl   $0x1,%eax
  10.     1198:       e8 93 fe ff ff          callq  1030 <printf@plt>
  11.     return 0;
  12.     119d:       b8 00 00 00 00          movl   $0x0,%eax
  13. }
  14.     11a2:       5d                      popq   %rbp
  15.     11a3:       c3                      retq
复制代码

  1. int main(void) {
  2.     1189:       55                      pushq  %rbp
  3.     118a:       48 89 e5                movq   %rsp,%rbp
  4.     118d:       48 83 ec 10             subq   $0x10,%rsp
  5.     int a = 2, b = 3;
  6.     1191:       c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%rbp)
  7.     1198:       c7 45 fc 03 00 00 00    movl   $0x3,-0x4(%rbp)
  8.     printf("%f\n", pow(a, b));
  9.     119f:       66 0f ef c0             pxor   %xmm0,%xmm0
  10.     11a3:       f2 0f 2a 45 fc          cvtsi2sdl -0x4(%rbp),%xmm0
  11.     11a8:       66 0f ef d2             pxor   %xmm2,%xmm2
  12.     11ac:       f2 0f 2a 55 f8          cvtsi2sdl -0x8(%rbp),%xmm2
  13.     11b1:       66 48 0f 7e d0          movq   %xmm2,%rax
  14.     11b6:       66 0f 28 c8             movapd %xmm0,%xmm1
  15.     11ba:       66 48 0f 6e c0          movq   %rax,%xmm0
  16.     11bf:       e8 bc fe ff ff          callq  1080 <pow@plt>
  17.     11c4:       66 48 0f 7e c0          movq   %xmm0,%rax
  18.     11c9:       66 48 0f 6e c0          movq   %rax,%xmm0
  19.     11ce:       48 8d 05 4b 0e 00 00    leaq   0xe4b(%rip),%rax        # 2020 <_IO_stdin_used+0x20>
  20.     11d5:       48 89 c7                movq   %rax,%rdi
  21.     11d8:       b8 01 00 00 00          movl   $0x1,%eax
  22.     11dd:       e8 4e fe ff ff          callq  1030 <printf@plt>
  23.     return 0;
  24.     11e2:       b8 00 00 00 00          movl   $0x0,%eax
  25. }
  26.     11e7:       c9                      leaveq
  27.     11e8:       c3                      retq
复制代码


是的,因为pow的参数全是常量,编译器就直接帮你计算好了,没有调用pow函数,所以编译的时候不用加 -lm
不用加-lm,是因为没有使用math库里面的东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-11-1 19:24:32 | 显示全部楼层
2G}30KI9TFWRZONZ3YC8~YF.png {SR@)%FM09EZ)~L08EW07_M.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-1 19:25:11 | 显示全部楼层

回帖奖励 +2 鱼币

编译选项加上 -lm 试试呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-1 19:27:36 | 显示全部楼层

回帖奖励 +2 鱼币

        用这条命令编译
  1. gcc -lm -o zy1 zy1.c
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-1 19:27:56 | 显示全部楼层

回帖奖励 +2 鱼币

你看一下教程中的编译命令,是不是不对?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-1 19:33:14 | 显示全部楼层
dolly_yos2 发表于 2022-11-1 19:25
编译选项加上 -lm 试试呢

UD(BZY@D1FNUZVHOISE13L4.png 成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-1 19:36:34 | 显示全部楼层
御坂19090 发表于 2022-11-1 19:33
成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?

#include <math.h>
意思是 使用math这个库
这个库在编译的时候需要加一个 -lm
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-11-1 19:37:31 | 显示全部楼层    本楼为最佳答案   
御坂19090 发表于 2022-11-1 19:33
成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?

当然不是,这里处理的是链接器链接的问题
由于原先编译系统不知道要链接这个库(数学库)因此引用 pow 函数的时候出现了链接错误
可以看看 man pow
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-1 19:50:17 | 显示全部楼层
人造人 发表于 2022-11-1 19:41
-lm对应的是 /lib/libm.so
就是前面去掉lib后面去掉.so剩下的
举个例子

那就是说,有的include后要加一点东西才可以使用。谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-1 19:53:21 | 显示全部楼层
御坂19090 发表于 2022-11-1 19:50
那就是说,有的include后要加一点东西才可以使用。谢谢

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-11-1 19:55:44 | 显示全部楼层

对了,突然想起来,好像pow(这里面全部都是数字的话,不需要-lm也可以使用呀?这个有什么区别吗?)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-1 20:19:37 | 显示全部楼层
人造人 发表于 2022-11-1 20:02
是的,因为pow的参数全是常量,编译器就直接帮你计算好了,没有调用pow函数,所以编译的时候不用 ...

嗯,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-1 20:38:18 | 显示全部楼层

回帖奖励 +2 鱼币

是要加 -lm ,对吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-5 04:50:53 | 显示全部楼层

回帖奖励 +2 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 07:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表