1. ホーム
  2. c

[解決済み】なぜC言語で数学ライブラリをリンクする必要があるのですか?

2022-03-30 11:16:26

質問

もし <stdlib.h> または <stdio.h> C言語のプログラムでは、コンパイル時にこれらをリンクする必要はありませんが <math.h> を使用すると -lm をgccで使用する場合などです。

gcc test.c -o test -lm

この理由は何でしょうか?なぜ、数学ライブラリーは明示的にリンクしなければならないのに、他のライブラリーはリンクしないのでしょうか?

どのように解決するのですか?

の関数は stdlib.hstdio.h には実装があります。 libc.so (または libc.a のように)、デフォルトで実行ファイルにリンクされます。 -lc が指定された場合)。 GCCは、この自動リンクを避けるように -nostdlib または -nodefaultlibs オプションを使用します。

の数学関数は math.h には実装があります。 libm.so (または libm.a は静的リンクの場合)、そして libm はデフォルトではリンクされていません。 これには歴史的な理由があります libm / libc を分割し、どれもあまり納得のいくものではありませんでした。

興味深いことに、C++ ランタイムの libstdc++ が必要です。 libm ということで、C++のプログラムをGCCでコンパイルした場合( g++ を使用すると、自動的に libm でリンクされています。