質問
次のコードスニペットがあるとしましょう。
int i; double value;
for(i = 0; i < CONSTANT; i++) {
value = (double)pow(2, i);
}
このコードをコンパイルしようとすると、「未定義の参照」エラーが得られます。
含む、または除外 math.h
とにかく含まれているので、違いはありません。
育てる 2.0
ハードコーディングされたパワーには大丈夫ですが、指数を含む式に置き換えるとすべてが失敗します i
.
私は何が間違っているのですか?ありがとう。
解決
それは非常に興味深い行動であり、良い学習の例です。
問題を解決するには、追加してください
-lm
GCCコマンドラインに(GCCを使用している場合)。これにより、コンパイラに数学ライブラリにリンクするように指示します。
起こっているように見えることは、あなたが使用している場合です
pow(2.0, 3);
コンパイラは、この式が定数に評価され、単なる代替を行うことを認識します。
したがって、ライブラリ関数を呼び出す必要はありません。
他のヒント
実際に数学ライブラリを含めるには、-LMとリンクする必要があります。
コンパイラがPOWコールを最適化したため、ハードコーディング値で機能しました。
数学ライブラリに対してリンクする必要があります。
gcc program.c -lm
その理由は、GCC(および他の一部のコンパイラ)に組み込みがあるためです pow()
リテラル定数の関数。だからあなたが電話するなら pow()
2.0で手動で、コンパイラは実際に答えが何であるかを把握し、それをあなたに置き換えます。変数入力を使用すると、コンパイラは数学ライブラリに依存する必要があります。これはリンクする必要があります。
のコード pow
数学ライブラリの一部です。そのライブラリにリンクする必要があります(デフォルトでリンクされているCライブラリに加えて)。
それを行うには、GCCで指定します -lm
コンパイラの呼び出しについて
gcc ... -lm
http://www.cplusplus.com/reference/clibrary/cmath/pow/
Cでは、この名前に2つの二重パラメーターを使用しているバージョンのみが存在します。他の過負荷はC ++でのみ利用可能です。
intに合格できないように見えるので、作るだけです i
ダブルとそれが機能するはずです。