79

私はこの簡単なコードを持っています:

max = (int) sqrt (number);

ヘッダーには次のものがあります。

#include <math.h>

しかし、アプリケーションはまだ未定義の への参照を言っていますsqrt。ここに問題はありますか?すべてがうまくいくはずです。

4

5 に答える 5

113

使用しているシステムに関係なく、次のような数学ライブラリにリンクする必要がある場合があります。

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

ヘッダーを含めると、コンパイラは関数宣言について知ることができますが、その関数を実行するために必要なコードに必ずしも自動的にリンクするとは限りません。

それができない場合は、コード、コンパイル コマンド、実行しているプラ​​ットフォーム (オペレーティング システム、コンパイラなど) を提示する必要があります。

次のコードは正常にコンパイルおよびリンクされます。

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

一部のコンパイル システムは、コマンド ラインで指定されたライブラリの順序に依存することに注意してください。つまり、ライブラリを順番に処理し、シーケンスのその時点で未解決のシンボルを満たすためにのみそれらを使用する可能性があるということです。

したがって、たとえば、次のコマンドが与えられた場合:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

ライブラリからplugh.o何かが必要なxyzzy場合、2番目は期待どおりに機能しない可能性があります。ライブラリをリストした時点で、解決すべき未解決のシンボルはありません。

からの未解決のシンボルが表示されplugh.o たら、手遅れです。

于 2011-03-09T16:34:53.533 に答える
27

math.h をインポートしたと思います#include <math.h>

したがって、私が見ることができる他の唯一の理由は、リンク情報が欠落していることです。-lmコードをオプションにリンクする必要があります。

単に gcc で 1 つのファイルをコンパイルしようとしている場合は-lm、コマンド ラインに を追加するだけです。それ以外の場合は、ビルド プロセスに関する情報を入力してください。

于 2011-03-09T16:36:53.310 に答える