#include <math.h>
#include <stdio.h>
int main(void)
{
double x = 4.0, result;
result = sqrt(x);
printf("The square root of %lf is %lfn", x, result);
return 0;
}
此代码不起作用,因为它采用变量的平方根。如果您将sqrt(x)
更改为sqrt(20.0)
,代码就可以正常运行,为什么?请解释一下。
另外,我如何获得变量的平方根(这是我真正需要的)?
输出:
matthewmpp@annrogers:~/Programming/C.progs/Personal$ vim sqroot1.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -c sqroot1.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot1 sqroot1.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ ./sqroot1
4.472136
matthewmpp@annrogers:~/Programming/C.progs/Personal$ vim sqroot2.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -c sqroot2.c
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c
/tmp/ccw2dVdc.o: In function `main':
sqroot2.c:(.text+0x29): undefined reference to `sqrt'
collect2: ld returned 1 exit status
matthewmpp@annrogers:~/Programming/C.progs/Personal$
注意:sqroot1是20.0的sqroot。 sqroot2是变量的sqroot。
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c -lm
matthewmpp@annrogers:~/Programming/C.progs/Personal$ ./sqroot2
4.472136
matthewmpp@annrogers:~/Programming/C.progs/Personal$
解决。
答案 0 :(得分:35)
如果要链接到正确的库(libc.a和libm.a),代码应该可以正常工作。您的问题可能是您正在使用gcc并且忘记通过-lm
链接到libm.a,这会给您一个未定义的sqrt引用。 GCC在编译时计算sqrt(20.0)
,因为它是常量。
尝试使用
进行编译gcc myfile.c -lm
编辑:更多信息。在sqrt
调用中将x替换为常量时,可以通过查看生成的程序集来确认这一点。
gcc myfile.c -S
然后查看myfile.s
中的程序集,您将无法在任何位置看到行call sqrt
。
答案 1 :(得分:1)
你应该这样做:
root@bt:~/Desktop# gcc -lm sqrt.c -o sqrt
root@bt:~/Desktop# ./sqrt
The square root of 4.000000 is 2.000000n
root@bt:~/Desktop#