1

次のプログラムが与えられた場合:

#include <math.h>
#include <stdio.h>

int
main(void)
{
    double x = sqrt(2);
    printf("The square root of two is %f\n", x);
    return 0;
}

そしてコンパイル:

gcc calc.c -o calc

成功しますか?-lm または /usr/lib/blah/libm.so.x を必要としないのはなぜですか

ldd を使用してバイナリ オブジェクトを検査すると、以下が生成されます。

linux-vdso.so.1 (0x00007fff4f5e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feeffd1b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fef000e1000

libm は参照されません。しかし、nm -D を使用して libc.so.6 ライブラリーまたは ld-linux-x86-64.so.2 ライブラリーを見ると、これらのライブラリーには sqrt 関数がありません。

何が起きてる?gcc は魔法のように、一般的な関数のデフォルト セットを含めていますか?

4

1 に答える 1

3

いいえ、gcc コンパイラは sqrt(2) が定数値であることを認識しており、コンパイル時に値を計算するだけです。

ライブラリ関数の使用をトリガーするには、次のsqrt()ようなコードを使用します。

volatile double y = 2;
double x = sqrt(y);

-ffreestandinggcc オプションを使用することもできますが、これはお勧めしません。

于 2015-10-01T23:14:36.703 に答える