数学ライブラリを使用するファイルを実行しようとしていました (より具体的には、sqrt() 関数を使用していました)。そこで、gcc fileName.c -o fileName と入力すると、「`sqrt' への未定義の参照」と言い続けました。しかし、私がグーグルで調べていたとき、誰かが私の gcc 呼び出しの最後に -lm を追加するように言いましたが、その理由がわかりません。誰か説明できますか? ありがとう。
サム
追加する-lm
と、数学ライブラリに対してリンクするように gcc に指示されます。
-l<name> link against the library with name <name>
C のコンパイルには、オブジェクト コードへのコンパイルとリンクという 2 つの異なる手順があります。オブジェクト コードへのコンパイルでは、ファイルはそのままコンパイルされ、外部シンボル (ヘッダーを含めることによって得られるシンボルなど) は "空白" として残されます。次の段階であるリンクでは、これらの空白が埋められます。多くのライブラリでは、gcc にどこを探すかを指示する必要があるため、-l
フラグ (この場合-lm
は数学用) を指定する必要があります。
-lm
厳密にはコンパイラではなくリンカー (ld) の呼び出しが必要ですが、gcc はコンパイル後にリンカーを呼び出して引数を転送できます。より複雑なプロジェクトでは、リンカーを個別に呼び出します。
リンカのコマンド ライン オプションについてはここで説明し、コンパイラのコマンド ライン オプションについてはここで説明します。
オプション-l
namespecは lib*namespec*.a という名前のスタティック ライブラリをリンクしますが、 filenameはライブラリ filename をリンク-l:
します。代替形式の--library=
namespecまたは--library=
filenameがサポートされています。
-lm
リンク libm.a - 数学ライブラリ。標準ライブラリの非数学部分は libc.a にありますが、これは通常デフォルトでリンクされているため、明示的に指定しません。