5

私はあちこちにインクルードしてきましたが<string.h>、インクルードしようとした瞬間に、 の定義にアクセスするにはメイクファイルを変更する必要があることがわかりました。<math.h>pow()pow

また、追加のライブラリを含める必要がある場合にどこで検索できるかもわかりません。-lm私はそのフラグ (または少なくともそのフラグ) が標準 c 数学ライブラリを示していることをランダムに読み取りましmたが、他の標準 c ライブラリが何と呼ばれるかはわかりません。

私はただ見ただけでuser/local/lib、私が見るのは次のとおりです。

$ cd /usr/local/lib
$ ls -al
drwxr-xr-x  3 root root  4096 Apr 25  2012 .
drwxr-xr-x 10 root root  4096 Apr 25  2012 ..
drwxrwsr-x  4 root staff 4096 Oct 14 10:19 python2.7
4

4 に答える 4

6

string.hは標準ライブラリのモジュールへのヘッダー参照ですが、歴史的な理由により、標準ライブラリのmath.hモジュールへのヘッダー参照ではありません。通常、プログラムをコンパイルするときに、デフォルトで標準ライブラリのみがリンカーに含まれます。

ある時点で、libm.so math.hメモリ、CPU パフォーマンスなどをより最適化した他の実装で実装を置き換えることができました。事実上、単一のlibm.so「デフォルト」実装はありませんでした。ただし、ほとんどのシステムでは、少なくとも実装が提供されていました。その実装は、デフォルトのライブラリの場所にlibm.soあり、 にリンクされ-lmます。

使用できることがわかっているより高速な (おそらく精度が低くても) ライブラリがある場合は、システム提供のmath.h libm.so実装をオーバーライドすることができました。

初期の CRAY システム (私は 1 つに取り組みませんでした) は、適切な「完全な」数学演算を行わないように、いくつかの数学の実装を最適化しました。計算の有効桁数が原因で、多くの場合重要ではないコード。(ワシントンDCの暗号博物館の展示についての私の理解から)

複数の実装の問題は、選択の余地があるということです。標準 C ライブラリは、実装の選択肢を提供するように構成されていません。

于 2013-10-22T18:37:25.457 に答える
1

標準 C ライブラリ関数はすべて で定義されてlibcおり、リンカー時にリンカーによって自動的に行われるため、プログラムにリンクする必要はありません。これに対する唯一の例外は、数学関数です。それらは、 と呼ばれる別のライブラリに入れられlibmます。これらは、UNIX の Fortran コンパイラに関連する歴史的な理由から、別のライブラリに入れられました (この主張を裏付ける情報源はありません)。

于 2013-10-22T18:36:58.400 に答える
0

数学ライブラリの実装は (通常) 2 つの部分に分かれています。

<math.h>通常、ヘッダー ファイルです/usr/include/math.hpowおよびその他の関数への呼び出しを生成する方法をコンパイラに指示するのは、C ソース コードです。デフォルトで利用できるはずです。必要なのは だけ#include <math.h>で、コンパイラはそれを見つける場所を知っています。(だからあなたのタイトルは少し誤解を招くものです。)

で宣言された関数は、 (コンパイル後に) プログラムにリンクできるプリコンパイル済みの実行可能コードを含むライブラリ ファイルに<math.h>実装されます。そのライブラリは、歴史的な理由から、通常、デフォルトでは検索されません-lm。追加のオプションを指定して、リンカーにライブラリの場所を伝える必要があります。(これは広くバグと見なされています。一方、デフォルトで数学ライブラリを検索しないと、リンクがわずかに速くなる可能性があり、ほとんどの C プログラムは数学ライブラリを使用しません。)

于 2013-10-22T19:44:46.870 に答える