次のプログラムが与えられた場合:
#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 は魔法のように、一般的な関数のデフォルト セットを含めていますか?