正しいmath.hヘッダーファイルへの参照を使用してコードをコンパイルしましたが、それをリンクしようとしたときに、数学ライブラリをインクルードするオプションを忘れました。その結果、.oオブジェクトファイルをコンパイルすることはできますが、実行可能ファイルをビルドすることはできません。
-lm
Paulがすでに述べたように、実行可能ファイルを生成しようとしているステップで数学ライブラリにリンクするために「」を追加します。
コメントで、linuxDは次のように質問します。
なぜ、sin()
で、明示的にオプション<math.h>
が必要なのですか。-lm
しかし、ではありませんprintf()
か<stdio.h>
?
これらの機能は両方とも「SingleUNIXSpecification」の一部として実装されているためです。この標準のこの歴史は興味深いものであり、多くの名前で知られています(IEEE Std 1003.1、X / Open Portability Guide、POSIX、Spec1170)。
この標準は、特に「標準Cライブラリ」ルーチンを「標準C数学ライブラリ」ルーチン(277ページ)から分離します。関連する一節を以下にコピーします。
標準Cライブラリ
cc
標準Cライブラリは、外部参照を解決するために自動的に検索さ
れます。このライブラリは、数学ルーチンを除いて、第1巻で定義されているベースシステムのすべてのインターフェイスをサポートします。
標準C数学ライブラリ
このライブラリは、第1巻で定義されているように、基本システムの数学ルーチンをサポートしています。このcc
オプション
-lm
は、このライブラリを検索するために使用されます。
この分離の背後にある理由は、いくつかの要因の影響を受けました。
- UNIX戦争は、元のAT&TUNIX製品からの相違を増大させました。
- UNIXプラットフォームの数により、オペレーティングシステム用のソフトウェアの開発が困難になりました。
- 1988 POSIXと呼ばれる、ソフトウェア開発者の最小公分母を定義する試みが開始されました。
- ソフトウェア開発者は、より多くのプラットフォームに到達するために、「POSIX準拠システム」でソフトウェアを提供するようにPOSIX標準に対してプログラムしました。
- UNIXのお客様は、ソフトウェアを実行するために「POSIX準拠」のUNIXシステムを要求しました。
別のライブラリを配置するという決定につながった圧力には-lm
、おそらく次のものが含まれますが、これらに限定されません。
- 多くのアプリケーションは数学ライブラリに埋め込まれた関数を使用しないため、libcのサイズを抑えるのに良い方法のようです。
- これは、数学ライブラリの実装に柔軟性を提供します。一部の数学ライブラリは、より大きな埋め込みルックアップテーブルに依存し、他の数学ライブラリは、より小さなルックアップテーブル(コンピューティングソリューション)に依存する場合があります。
- 真にサイズに制約のあるアプリケーションの場合、非標準的な方法で数学ライブラリを再実装できます(たとえば、引き出して
sin()
カスタムビルドのライブラリに入れるなど)。
いずれにせよ、C言語の一部として自動的に含まれないことが標準の一部になっているため、を追加する必要があります-lm
。