kri*_*hna 7 c gcc static-libraries
当我在log2()中传递常量值时,如下所示
#include <stdio.h>
#include<math.h>
int main(int argc, char* argv[])
{
int var;
var= log2(16);
printf("%d",var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
给出错误
undefined reference to `log2'
Run Code Online (Sandbox Code Playgroud)
在第一段代码中,编译器替换log2(16)常量4.编译器通常以这种方式优化常量数学.这就是你没有看到错误的原因.
请参阅生成的代码以进行确认.这是您的第一个版本:
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
Run Code Online (Sandbox Code Playgroud)
没有调用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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的call log2,此版本中有一个.这就是-lm第二个版本需要的原因.