質問

次のコードスニペットがあるとしましょう。

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 ダブルとそれが機能するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top