鱼C论坛

 找回密码
 立即注册
查看: 3203|回复: 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2022-11-1 20:02:17 | 显示全部楼层
御坂19090 发表于 2022-11-1 19:55
对了,突然想起来,好像pow(这里面全部都是数字的话,不需要-lm也可以使用呀?这个有什么区别吗?)
int main(void) {
    1179:       55                      pushq  %rbp
    117a:       48 89 e5                movq   %rsp,%rbp
    printf("%f\n", pow(2, 3));
    117d:       48 8b 05 3c 0f 00 00    movq   0xf3c(%rip),%rax        # 20c0 <_IO_stdin_used+0xc0>
    1184:       66 48 0f 6e c0          movq   %rax,%xmm0
    1189:       48 8d 05 90 0e 00 00    leaq   0xe90(%rip),%rax        # 2020 <_IO_stdin_used+0x20>
    1190:       48 89 c7                movq   %rax,%rdi
    1193:       b8 01 00 00 00          movl   $0x1,%eax
    1198:       e8 93 fe ff ff          callq  1030 <printf@plt>
    return 0;
    119d:       b8 00 00 00 00          movl   $0x0,%eax
}
    11a2:       5d                      popq   %rbp
    11a3:       c3                      retq
int main(void) {
    1189:       55                      pushq  %rbp
    118a:       48 89 e5                movq   %rsp,%rbp
    118d:       48 83 ec 10             subq   $0x10,%rsp
    int a = 2, b = 3;
    1191:       c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%rbp)
    1198:       c7 45 fc 03 00 00 00    movl   $0x3,-0x4(%rbp)
    printf("%f\n", pow(a, b));
    119f:       66 0f ef c0             pxor   %xmm0,%xmm0
    11a3:       f2 0f 2a 45 fc          cvtsi2sdl -0x4(%rbp),%xmm0
    11a8:       66 0f ef d2             pxor   %xmm2,%xmm2
    11ac:       f2 0f 2a 55 f8          cvtsi2sdl -0x8(%rbp),%xmm2
    11b1:       66 48 0f 7e d0          movq   %xmm2,%rax
    11b6:       66 0f 28 c8             movapd %xmm0,%xmm1
    11ba:       66 48 0f 6e c0          movq   %rax,%xmm0
    11bf:       e8 bc fe ff ff          callq  1080 <pow@plt>
    11c4:       66 48 0f 7e c0          movq   %xmm0,%rax
    11c9:       66 48 0f 6e c0          movq   %rax,%xmm0
    11ce:       48 8d 05 4b 0e 00 00    leaq   0xe4b(%rip),%rax        # 2020 <_IO_stdin_used+0x20>
    11d5:       48 89 c7                movq   %rax,%rdi
    11d8:       b8 01 00 00 00          movl   $0x1,%eax
    11dd:       e8 4e fe ff ff          callq  1030 <printf@plt>
    return 0;
    11e2:       b8 00 00 00 00          movl   $0x0,%eax
}
    11e7:       c9                      leaveq
    11e8:       c3                      retq

是的,因为pow的参数全是常量,编译器就直接帮你计算好了,没有调用pow函数,所以编译的时候不用加 -lm
不用加-lm,是因为没有使用math库里面的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-11-1 19:24:32 | 显示全部楼层
2G}30KI9TFWRZONZ3YC8~YF.png {SR@)%FM09EZ)~L08EW07_M.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

编译选项加上 -lm 试试呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

        用这条命令编译
gcc -lm -o zy1 zy1.c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

你看一下教程中的编译命令,是不是不对?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

UD(BZY@D1FNUZVHOISE13L4.png 成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

#include <math.h>
意思是 使用math这个库
这个库在编译的时候需要加一个 -lm
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

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

那就是说,有的include后要加一点东西才可以使用。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

对了,突然想起来,好像pow(这里面全部都是数字的话,不需要-lm也可以使用呀?这个有什么区别吗?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

是要加 -lm ,对吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +2 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 13:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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