わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

こんにちは,エラーのある世界 (3)prinftと書いたら

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