こんにちは,エラーのある世界(0)のhello.cについて,5行目の「printf」を「prinft」に変更して,hello3.cという名前で保存しておきます.このファイルをコンパイルすると,エラーになります.本日は,実行環境1と実行環境2とで,エラーメッセージが一部異なります.
実行環境1のコマンドは:
$ cat hello3.c $ cc hello3.c hello3.c: In function ‘main’: hello3.c:5:3: warning: implicit declaration of function ‘prinft’; did you mean ‘printf’? [-Wimplicit-function-declaration] prinft("hello, world\n"); ^~~~~~ printf (略): In function `main': hello3.c:(.text+0x11): undefined reference to `prinft' collect2: error: ld returned 1 exit status
実行環境1では:
今回の画像には,灰色のによる横長の線も1本,あります.ここにはファイル名が記載されます.
実行環境2のコマンドは:
$ cat hello3.c $ cc hello3.c hello3.c: In function ‘main’: hello3.c:5:3: warning: implicit declaration of function ‘prinft’; did you mean ‘printf’? [-Wimplicit-function-declaration] prinft("hello, world\n"); ^~~~~~ printf (略): 関数 `main' 内: hello3.c:(.text+0x11): `prinft' に対する定義されていない参照です collect2: error: ld returned 1 exit status
実行環境2では:
「hello3.c:5:3: warning」から始まる警告が出ます.メッセージをしっかり読めば,「prinftって書いているけど,本当はprintfじゃないの?」というのも分かるのですが,Cのコンパイル時の挙動に関連して,詳しく書いておきます.
「warning:」の直後に「implicit declaration of function ‘prinft’」とあり,これを直訳すると「関数prinftの暗黙の宣言」となります.そこより前に(ヘッダファイルstdio.hの中にも),prinftが宣言されていないのですが,とりあえずprinftという関数があるものとして,警告しつつ,コンパイルを続行するというメッセージです.
メッセージを読み進めまして,最後の「collect2: error: ld returned 1 exit status」でエラーとなり,実行ファイルが作られなかったことを意味します.
一つ前の行の「hello3.c:(.text+0x11): undefined reference to `prinft'」は,prinftについての処理(より正確にはreference=参照)がどこにもなかった(undefined=定義されていない)ことを表します.
「ld」はリンカのコマンドです.もし,printf関数を呼び出しすのであれば,このコマンドが標準ライブラリの中のprintfとリンクしてくれます.今回はそのリンク作業で失敗した,ということで,「リンクエラー」とも呼ばれます.何行目がエラーと教えてくれないのは,リンクエラーの特徴の一つです.