明日は,旧7月1日らしい。朝夕はすっかり秋めいてきたが,昼は相変わらず暑い。それでも,盆休みが終わって,昨日1週間ぶりで道々の田んぼを見たら,稲穂が出そろっていた。今日はツクツクボウシの鳴くのも聞いた。そして今は,これから夕立が来るのか,PCに触っているのが気持ち悪いほど,雷鳴がしている。
夕べはギータの劇的なサヨナラホームランで勝った。球宴後,さあダッシュと思ったら,がっくりくる試合が続いて落ち込んでいたのだが,8月に入ってから,まあまあだ。何とか,5割復帰したし。上も抜け出せないでいるから,ここが踏ん張りどころだよー。鷹のみなさま,頑張ってちょうだい。
ところで本題の方だが,いつも,buildとmakeはどう違うんだろうと思っていた。今回ちょっと気を入れてあちこち読み漁ってみたら,用語の発生した時期が違うだけで意味はあまり違わないらしいネ。少し,違う意味で使っているページもあるようだが,作業的にはだいたい同じことをやっているようだ。
CentOS6の練習-#6で書いたように,すべてパッケージで済ませるかどうか悩んでいるが,それにしてもこの際buildの勉強は身を入れてやっておくべきだろう。今まで,実践でビルドにかかわったことはあっても,何やっているかなんて,あまりまじめに考えたことがない。コンパイルはやってるんだろうとか思ってたけど,リンクなんかの作業も入るんだねー。知らなかった。
まっ,ありがちな「Hello, World!」の表示プログラムのbuildでもやってみるかな。今回の参照ページは,仕事で使える魔法のLAMPだけ。
- まずは,GCC(GNU Compiler Collection)のインストール。こういうところはパッケージを利用する(爆)。
$ sudo yum install gcc gcc-c++ - $ vi hello.c
で,/home/centosに,以下の内容で,hello.cを作成する。
#include <stdio.h>
main()
{
printf(“Hello, World!n”);
} - $ gcc hello.c -o hello
で,コンパイルしてみる。-oオプションで実行ファイル名をhelloに指定。一瞬で終わるよ。 - $ ./hello
と実行してみると,
Hello, World!
と,表示された。
ふーん,シェアードライブラリ(=.so⇒シェアードオブジェクト)っていうのは,Winのダイナミックリンクライブラリ(.dll)と同じなんだ。以下のコマンドで,いつもお世話になっているbashがリンクしている.soを調べてみた。
$ ldd /bin/bash
linux-gate.so.1 => (0x003da000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0x00e49000) <<— helloと違う.so
libdl.so.2 => /lib/libdl.so.2 (0x004dc000) <<— helloと違う.so
libc.so.6 => /lib/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00b31000)
ついでに, $ ldd hello をやって比べてみた。
linux-gate.so.1 => (0x00d44000)
libc.so.6 => /lib/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00634000)
となるので,この3つは簡単なプログラムでも,C言語で書かれたプログラムが動くためには,絶対にいるようだネ。
次に,hello.cを2つの分けて,一つずつコンパイルした後,リンカを使って一つのファイルに仕上げる作業をやってみる。
- $ vi main.c で,以下の内容のmain.cを作成する。
main()
{
hello();
} - $ vi hello.c で,以下の内容のhello.cを作成する。この際,ひらがなの表示を試してみることにした。
#include <stdio.h>
hello()
{
printf(“こんにちは,みなさん!n”);
} - まず,main.cだけコンパイル。 $ gcc -c main.c
lsで調べると分かるけど,この段階で main.o ができている。 - 次に,hello.cをコンパイル。 $ gcc -c hello.c
これも調べると hello.o ができている。
-cオプションのときは,「name」.c ⇒ 「name」.oというように.oのファイル名を決めるようだ。 - リンク作業。素のリンカldは使わずに,gccから呼び出す形で使う方が普通だそうだ。
$ gcc main.o hello.o -o hello
調べてみると,実行ファイルhelloができているので,
$ ./hello
と実行してみると,
こんにちは,みなさん!
と,表示された。ちゃんと,ひらがなも表示される。日本語フォントを特別に手動で入れる必要はないようだ。
この時点で,/home/centosには
hello hello.c hello.o main.c main.o
があるが,あとの都合上生成された hello,hello.o,main.o を削除する。
$ rm hello main.o hello.o
さて,makeをインストールしますか。
$ sudo yum install make
Makefile作成。 $ vi Makefile で,内容は次の1行。
hello: main.o hello.o
ターゲット: 依存ファイル1 依存ファイル2 ……
となるらしいが,今回は,main.o と hello.o から hello を作るだけなので,この1行でO.K.
makeを走らせてみる。
$ make
cc -c -o hello.o hello.c
cc -c -o main.o main.c
cc hello.o main.o -o hello
とメッセージが出て,終了すると,/home/centosに hello,hello.o,main.o ができている。
$ touch hello.c
をやったのち,makeをやると,
cc -c -o hello.o hello.c
cc hello.o main.o -o hello
さっきよりメッセージが1行少ない。touchでタイムスタンプの変わったhello.cだけがコンパイルし直されて,新しいhelloが作られることが分かる。
本日の最後の練習は,GNU Helloを使った実行ファイルの作成。
- まず,ダウンロードのために wget をインストール。もっとも,自鯖の場合,この間のClamAVがらみでwgetは導入済み(汗)。
$ sudo yum install wget - 最新のGNU Helloをゲット。
$ wget http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz - 同じバージョンのシグネチャファイルもダウンロード。
$ wget http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz.sig - GnuPG(調べてみたら,gnupg2-2.0.14-4.el6.i686が,すでにインストール済みだった。)を使って,ファイルの正当性を確認する。
$ gpg –list-keys <<— 初回起動で,/home/centos/.gnupg が作成される。
$ vi ~/.gnupg/gpg.conf
で,中ごろにある keyserver-options auto-key-retrieve 行をアンコメントする。 - 以下のコマンドで,シグネチャの確認。
$ gpg –verify hello-2.8.tar.gz.sig
これ,何もしないでやったら日本語のメッセージが戻ってきたが,変な日本語。もちっとどうにかならんの。
————————————————————————————————————————
gpg: 2012年04月21日 02時55分39秒 JSTにDSA鍵ID 80EE4A00で施された署名
gpg: 鍵80EE4A00をhkpからサーバーkeys.gnupg.netに要求
gpg: 鍵80EE4A00: 公開鍵“Reuben Thomas <rrt@sc3d.org>”を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg: 読込み: 1
gpg: “Reuben Thomas <rrt@sc3d.org>”からの正しい署名 <<— こういう行があれば,O.K.というか,うーむ。
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: 9297 8852 A62F A5E2 85B2 A174 6808 9F73 80EE 4A00
———————————————————————————————————————— - パッケージを展開し,展開されてできたディレクトリに移動する。その後,ls -pで直下のファイルとディレクトリを確認する。
$ tar zxvf hello-2.8.tar.gz
$ cd hello-2.8
$ ls -p
————————————————————————————————————————
ABOUT-NLS GNUmakefile README build-aux/ doc/ po/
AUTHORS INSTALL README-release config.in lib/ src/
COPYING Makefile.am THANKS configure m4/ tests/
ChangeLog Makefile.in TODO configure.ac maint.mk
ChangeLog.O NEWS aclocal.m4 contrib/ man/
————————————————————————————————————————
/の付いてるやつはディレクトリね。READMEとかTODOとかINSTALLあたりは読むけど,あとはドキュメント関係でもあんまり読んだことがない(汗)。あっ,たまにChangeLogも読む。 - $ less INSTALL
「Briefly, the shell commands `./configure; make; make install’ should configure, build, and install this package.」ということなので,素直に,
$ ./configure –prefix=/opt/hello-2.8 <<— インストール先を/opt/hello-2.8にしてやってみた。
無事通ったので,もう1回, $ ls -p をやってみると,いろいろ変化があるが,大きなところで Makefile ができたのが分かる。とすると,ちゃんとmakeできるはずなので,
$ make$ ./configure | grep ‘checking’ | wc -l
で何をチェックしているのか項目数を調べてみた。参照ページでは,202と書いてあるが,うちのでは250あった。どんどん増えていくんだろうなあ。makeが終わったので,インストールしてみた。
$ sudo make install$ ls -p /opt/hello-2.8 で確認してみると,確かに bin/ share/ ができている。
$ ls -p /opt/hello-2.8/bin で見ると,中に実行ファイル hello があった。
$ /opt/hello-2.8/bin/hello と実行してみた。
世界よ、こんにちは!
と表示された。完了!!!
本日は,ここまで。