7

当我在 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(无错误)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

1 回答 1

8

在第一段代码中,编译器用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

没有调用 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需要第二个版本。

于 2013-04-01T05:14:45.893 回答