こんにちは,エラーのある世界(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とリンクしてくれます.今回はそのリンク作業で失敗した,ということで,「リンクエラー」とも呼ばれます.何行目がエラーと教えてくれないのは,リンクエラーの特徴の一つです.