御坂19090 发表于 2022-11-1 19:23:54

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

这个明明对了3,4遍了,每个字母都看过去了,但是,还是不对实验了一下,是i的问题,把i换成数字就没问题。为什么会这样啊?

人造人 发表于 2022-11-1 19:41:00

-lm对应的是 /lib/libm.so
就是前面去掉lib后面去掉.so剩下的
举个例子
#include <mpfr.h>
编译的时候要加 -lmpfr
对应的文件是 /lib/libmpfr.so

人造人 发表于 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          callq1030 <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          callq1080 <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          callq1030 <printf@plt>
    return 0;
    11e2:       b8 00 00 00 00          movl   $0x0,%eax
}
    11e7:       c9                      leaveq
    11e8:       c3                      retq


是的,因为pow的参数全是常量,编译器就直接帮你计算好了,没有调用pow函数,所以编译的时候不用加 -lm
不用加-lm,是因为没有使用math库里面的东西

御坂19090 发表于 2022-11-1 19:24:32

dolly_yos2 发表于 2022-11-1 19:25:11

编译选项加上 -lm 试试呢

jackz007 发表于 2022-11-1 19:27:36

      用这条命令编译
gcc -lm -o zy1 zy1.c

人造人 发表于 2022-11-1 19:27:56

你看一下教程中的编译命令,是不是不对?

御坂19090 发表于 2022-11-1 19:33:14

dolly_yos2 发表于 2022-11-1 19:25
编译选项加上 -lm 试试呢

成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?

人造人 发表于 2022-11-1 19:36:34

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

#include <math.h>
意思是 使用math这个库
这个库在编译的时候需要加一个 -lm

dolly_yos2 发表于 2022-11-1 19:37:31

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

当然不是,这里处理的是链接器链接的问题
由于原先编译系统不知道要链接这个库(数学库)因此引用 pow 函数的时候出现了链接错误
可以看看 man pow

御坂19090 发表于 2022-11-1 19:50:17

人造人 发表于 2022-11-1 19:41
-lm对应的是 /lib/libm.so
就是前面去掉lib后面去掉.so剩下的
举个例子


那就是说,有的include后要加一点东西才可以使用。谢谢

人造人 发表于 2022-11-1 19:53:21

御坂19090 发表于 2022-11-1 19:50
那就是说,有的include后要加一点东西才可以使用。谢谢

是的

御坂19090 发表于 2022-11-1 19:55:44

人造人 发表于 2022-11-1 19:53
是的

对了,突然想起来,好像pow(这里面全部都是数字的话,不需要-lm也可以使用呀?这个有什么区别吗?)

御坂19090 发表于 2022-11-1 20:19:37

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

嗯,谢谢

zhangjinxuan 发表于 2022-11-1 20:38:18

是要加 -lm ,对吧

sdad1990 发表于 2022-12-5 04:50:53

{:7_146:}
页: [1]
查看完整版本: 怎么看都没有问题,到底为什么呀?pow未定义的应用