[英]Getting GCC error when using SQLite and Fast Math: “SQLite will not work correctly with the -ffast-math option of GCC”
[英]error In using math function in gcc?
当我在log2()中传递常量值时,如下所示
#include <stdio.h>
#include<math.h>
int main(int argc, char* argv[])
{
int var;
var= log2(16);
printf("%d",var);
return 0;
}
gcc prog.c(NO Error)4
但是当我在函数log2(var)中传递变量时,给出了对`log2'的错误未定义引用我需要链接库即-lm
#include <stdio.h>
#include<math.h>
int main(int argc, char* argv[])
{
int var,i;
i= log2(var);
printf("%d",i);
return 0;
}
给出错误
undefined reference to `log2'
在第一段代码中,编译器用常量4
替换log2(16)
。 编译器通常以这种方式优化常量数学。 这就是你没有看到错误的原因。
请参阅生成的代码以进行确认。 这是您的第一个版本:
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl $4, 28(%esp)
movl $.LC0, %eax
movl 28(%esp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, %eax
leave
ret
没有调用log2。 编译器已将其替换为常量4( movl $4, 28(%esp)
)。
这个是你的第二个版本:
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $48, %esp
fildl 40(%esp)
fstpl (%esp)
call log2
fnstcw 30(%esp)
movzwl 30(%esp), %eax
movb $12, %ah
movw %ax, 28(%esp)
fldcw 28(%esp)
fistpl 44(%esp)
fldcw 30(%esp)
movl $.LC0, %eax
movl 44(%esp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, %eax
leave
ret
正如您所看到的,此版本中有一个call log2
。 这就是为什么第二个版本需要-lm
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.