一般的に、ヘッダーファイルmath.h
をインクルードする以外に数学関数を使用するには、リンカーオプション-lmを使用してリンクする必要があります。-l
ここでは、特定のライブラリを検索するためのリンカーオプションを意味しますlibm.o
。
私の質問は
GCCにデフォルトでこのライブラリが含まれていないのはなぜですか?ライブラリが数学コプロセッサを多用しており、浮動小数点の初期化を初期化するためにコードを追加する必要があるためですか(ここでは間違った用語を使用している可能性があります)。
ノート
リンクhttp://stackoverflow.comに記載されているすべての回答を確認しました。これは私にはあまり意味がありません。起因する3つの基本的な理由があります
- 標準ライブラリが利用可能であることが保証されています。pthreadのような他のposixライブラリを明示的にリンクすることは理にかなっていますが、なぜ標準ライブラリに対して明示的なリンクを行う必要があるのでしょうか。歴史的な理由でさえ、あまり明確ではありません。
- libmがlibcから分離されたのはなぜですか?
- 最近のgccコンパイラでこれらの動作を継承しているのはなぜですか?それはどのような単純さを達成しますか?これが私がテストしたもので、libmなしとlibmありです。libmのないもの、私は自分のバージョンのPowを書きました
これが例です
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
int i=20;
double output1=pow(2.618033988749895,i);
return 0;
}
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y) {
double _Z = 1;
for (; _Y; _X *= _X) {
if (_Y & 1) _Z *= _X;
_Y >>= 1;
}
return _Z;
}
int main() {
int i=20;
double output1=Pow(2.618033988749895,i);
return 0;
}
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l
261
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l
241