怎么看都没有问题,到底为什么呀?pow未定义的应用
这个明明对了3,4遍了,每个字母都看过去了,但是,还是不对实验了一下,是i的问题,把i换成数字就没问题。为什么会这样啊? -lm对应的是 /lib/libm.so就是前面去掉lib后面去掉.so剩下的
举个例子
#include <mpfr.h>
编译的时候要加 -lmpfr
对应的文件是 /lib/libmpfr.so
御坂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库里面的东西
编译选项加上 -lm 试试呢 用这条命令编译
gcc -lm -o zy1 zy1.c 你看一下教程中的编译命令,是不是不对?
dolly_yos2 发表于 2022-11-1 19:25
编译选项加上 -lm 试试呢
成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗? 御坂19090 发表于 2022-11-1 19:33
成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?
#include <math.h>
意思是 使用math这个库
这个库在编译的时候需要加一个 -lm
御坂19090 发表于 2022-11-1 19:33
成功了,那想要问一下,这种使用数字代替的都需要加一个lm吗?
当然不是,这里处理的是链接器链接的问题
由于原先编译系统不知道要链接这个库(数学库)因此引用 pow 函数的时候出现了链接错误
可以看看 man pow 人造人 发表于 2022-11-1 19:41
-lm对应的是 /lib/libm.so
就是前面去掉lib后面去掉.so剩下的
举个例子
那就是说,有的include后要加一点东西才可以使用。谢谢
御坂19090 发表于 2022-11-1 19:50
那就是说,有的include后要加一点东西才可以使用。谢谢
是的 人造人 发表于 2022-11-1 19:53
是的
对了,突然想起来,好像pow(这里面全部都是数字的话,不需要-lm也可以使用呀?这个有什么区别吗?) 人造人 发表于 2022-11-1 20:02
是的,因为pow的参数全是常量,编译器就直接帮你计算好了,没有调用pow函数,所以编译的时候不用 ...
嗯,谢谢 是要加 -lm ,对吧 {:7_146:}
页:
[1]