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)ます。

これは 2 番目のバージョン用です。

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、2 番目のバージョンには が必要です。

于 2013-04-01T05:14:45.893 に答える