next up previous
Next: 補足 1: 変数のスコープ Up: 例 1: ヘロンの公式を使った 3 Previous: 例 1: ヘロンの公式を使った 3

数学関数ライブラリの使い方

上のプログラムは, 通常の gcc コマンドでは, コンパイルできません.
e023199@cc1> gcc 4-2.c
を実行して, 出て来るメッセージを確認してください. 私の環境では, 次のようになりました.
gcc 4-2.c
Undefined                       first referenced
 symbol                             in file
sqrt                                4-2.o
ld: fatal: Symbol referencing errors. No output written to a.out
エラーメッセージは, 上のような表形式ででます. 1-2 行目は, 左側に未定義シンボルと書いてあって, 右側に 最初に参照されたファイルと書いてあります. 単に翻訳しただけですが, この程度の翻訳はできるのが, 大学生の常識です. 3 行目は, 上の物の内容で, 未定義シンボルが sqrt, 参照されたファイルが, 4-2.o という意味です. 4 行目の先頭は, このメッセージを出したコマンドで ld(link editor リンカ)でその後に書いてあるような事を言っています. (さて, なんて書いてあるのでしょう ?)

これは, ld がプログラム a.out を作り上げる際に sqrt という 関数がどこにも無かったので, 最後まで実行できなかったため 出て来たエラーメッセージです. UNIX の cc(ld) は, デフォルトでは 標準 C ライブラリ /usr/lib/libc.a(/usr/lib/libc.so) にある関数しか, ライブラリをリンクしません. sqrt は数学関数ライブラリにありますから, このような事が起こります. 標準ライブラリ以外のライブラリにある関数をリンクするには, オプション -l を cc に加えてコンパイルします. ちなみに, 数学関数ライブラリは, /usr/lib/libm.a(/usr/lib/libm.so) ですが, これをリンクするには 次のようにコマンドを打ちます.

e023199@cc1> gcc 4-2.c -lm
-l の後の文字 m の 意味 は上のファイルから類推できるでしょう. 他のライブラリをリンクする時も, 同様の規則で -l の後の アルファベットを指定します.



Next: 補足 1: 変数のスコープ Up: 例 1: ヘロンの公式を使った 3 Previous: 例 1: ヘロンの公式を使った 3