わさっきhb

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

コンパイルコマンド,あれこれ

授業で教えた,「コンパイルと実行のコマンド」を,並べてみます.ソースファイルはprogram.cとします.

cc program.c
./a.out
cc -o program program.c
./program
cc program.c -o program
./program
make program
./program
make program && ./program

コンパイル方法として有用なのは,3番目と5番目です.
3番目のように書くと,実行するときは,[.][/][Altl+/][Enter]の4つのキータイプですみます.シェル(bash)で,Altを押しながら/を押すと*1,直前のコマンドの最後の引数が出てきます.
またこの方法に,コンパイルオプションを追加することができます.例えば

  • 「cc program.c -Wall -o program」のように書いて,program.cの問題点を見つけ出したりできますし,
  • 「cc program.c -lm -o program」のように書いて,sinとかexpとかいった,数学に関するライブラリ関数を使うことができるようになります.

「-Wall」は,私は「ウォールオプション」と読んでいますが,意味は「-W」(警告に関するオプション)と「all」(すべての不審な情報を警告する)の組み合わせです.
「-o program」を「-oprogram」と書いても,手元のコンパイラではきちんとprogramという名前の実行ファイルができましたが,コマンド実行の慣習として,「-o」と,実行ファイルの名前の間には,空白文字を入れておくものです.
makeコマンドは,原則は「Makefileという名前のファイルに書かれている指示に従って,ターゲットとなるファイルを作っていく」というものです.ですが,いつからか*2Makefileがなくても,「make αを実行したとき,α.cがあれば,cc -o α α.cを実行してくれる」ようになりました.ということで,最もキーストローク数の少ないコンパイル方法だと思います.
最後の「&&」を使った例ですが,これは,まずmake programを実行します.そして正常に終了したときに限り,次の./programを実行します.これはまるで,Cの論理積演算子に似ていますが,ここの「&&」は実行コマンドの一部であり,シェルが解釈します.
なお,「make program; ./program」と書くこともできますが,この「;」は単純な接続を表し,make programが成功しても失敗しても,./programを実行することになります.コンパイルに失敗したら,実行ファイルができないので,./programはおそらくまともに実行できずに終わるでしょう.複数のコマンドを並べて書くとき,「&&」と「;」の区別はしたいです*3
最後の実行方法のメリットですが,このように,コンパイルと実行を一つのコマンドで書けば,もう一度コンパイルと実行をやり直すには,[↑][Enter]の2回で済みます.コンパイルと実行を別々のコマンドにしていれば,[↑][↑][Enter][↑][↑][Enter]としないといけません.どこに,キーストローク数という手間(コスト)を減らすか,という問題です.

*1:Altを押しながら_を押しても同じ効果ですが,_を押すにはShiftキーが必要なので,劣ります.

*2:私が大学生のときにも,makeコマンドを使いましたが,そのときにはこんな機能はありませんでした.サフィックスルールはありましたが.

*3:コマンド実行で「||」を使う機会はめったにありません