15

重複の可能性:
gcc:数学ライブラリをリンクするために-lmフラグが必要なのはなぜですか?

一般的に、ヘッダーファイルmath.hをインクルードする以外に数学関数を使用するには、リンカーオプション-lmを使用してリンクする必要があります。-lここでは、特定のライブラリを検索するためのリンカーオプションを意味しますlibm.o

私の質問は

GCCにデフォルトでこのライブラリが含まれていないのはなぜですか?ライブラリが数学コプロセッサを多用しており、浮動小数点の初期化を初期化するためにコードを追加する必要があるためですか(ここでは間違った用語を使用している可能性があります)。

ノート

リンクhttp://stackoverflow.comに記載されているすべての回答を確認しました。これは私にはあまり意味がありません。起因する3つの基本的な理由があります

  1. 標準ライブラリが利用可能であることが保証されています。pthreadのような他のposixライブラリを明示的にリンクすることは理にかなっていますが、なぜ標準ライブラリに対して明示的なリンクを行う必要があるのでしょうか。歴史的な理由でさえ、あまり明確ではありません。
  2. libmがlibcから分離されたのはなぜですか?
  3. 最近の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
4

3 に答える 3

11

浮動小数点演算が不可能または必要でないシステム(主に組み込み)に対応するためです。gcc確かに歴史的なものですが、他のほとんどのCコンパイラは、386SXが高性能プロセッサと見なされていた時代に作成されたことを忘れないでください。

例を挙げると、私がまだ組み込みコンピューティングで働いていたとき、標準のコンパイラ(MicrosoftとBorland)を使用して、プロセッサ(Z80、80186、68030)のコードを生成しました。コンパイラがデフォルトで数学ライブラリにリンクされていたとしたら、どのシステムにも浮動小数点機能がなく、必要さえなかったので、問題が発生したでしょう。

確かに30年後はばかげているように見えますが、その理由は当時は健全でした。

于 2012-04-29T12:58:28.450 に答える
1

歴史的な理由

理由libclibmは分離さ-lmれており、コマンドラインで指定する必要があるのは歴史的な理由です。これlibmは、Fortranコンパイラでも使用されていたためです。

于 2012-04-29T12:18:53.693 に答える
1

あなたが望むかもしれない多くのライブラリがありlibm、それらのほんの一例です。
これらのそれぞれについて、デフォルトで含まれていない理由を尋ねることができます。

おそらくlibm他のものよりも便利ですが、それでも、Cは物事をシンプルに保つことを好みます-あなたはライブラリが必要で、-lそれを使用するために使用します。

于 2012-04-29T11:24:26.197 に答える