3

数学ライブラリを使用するファイルを実行しようとしていました (より具体的には、sqrt() 関数を使用していました)。そこで、gcc fileName.c -o fileName と入力すると、「`sqrt' への未定義の参照」と言い続けました。しかし、私がグーグルで調べていたとき、誰かが私の gcc 呼び出しの最後に -lm を追加するように言いましたが、その理由がわかりません。誰か説明できますか? ありがとう。

サム

4

3 に答える 3

2

追加する-lmと、数学ライブラリに対してリンクするように gcc に指示されます。

-l<name> link against the library with name <name>
于 2013-05-17T20:02:32.173 に答える
2

C のコンパイルには、オブジェクト コードへのコンパイルとリンクという 2 つの異なる手順があります。オブジェクト コードへのコンパイルでは、ファイルはそのままコンパイルされ、外部シンボル (ヘッダーを含めることによって得られるシンボルなど) は "空白" として残されます。次の段階であるリンクでは、これらの空白が埋められます。多くのライブラリでは、gcc にどこを探すかを指示する必要があるため、-lフラグ (この場合-lmは数学用) を指定する必要があります。

于 2013-05-17T20:03:21.217 に答える
1

-lm厳密にはコンパイラではなくリンカー (ld) の呼び出しが必要ですが、gcc はコンパイル後にリンカーを呼び出して引数を転送できます。より複雑なプロジェクトでは、リンカーを個別に呼び出します。

リンカのコマンド ライン オプションについてはここで説明し、コンパイラのコマンド ライン オプションについてはここで説明します

オプション-lnamespecは lib*n​​amespec*.a という名前のスタティック ライブラリをリンクしますが、 filenameはライブラリ filename をリンク-l:ます。代替形式の--library=namespecまたは--library=filenameがサポートされています。

-lmリンク libm.a - 数学ライブラリ。標準ライブラリの非数学部分は libc.a にありますが、これは通常デフォルトでリンクされているため、明示的に指定しません。

于 2013-05-17T20:33:30.033 に答える