错误在gcc中使用数学函数?

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)

jma*_*man 7

在第一段代码中,编译器替换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第二个版本需要的原因.