Categories: Linux

CentOS6の練習-#9(ビルド環境を整える)。

 明日は,旧7月1日らしい。朝夕はすっかり秋めいてきたが,昼は相変わらず暑い。それでも,盆休みが終わって,昨日1週間ぶりで道々の田んぼを見たら,稲穂が出そろっていた。今日はツクツクボウシの鳴くのも聞いた。そして今は,これから夕立が来るのか,PCに触っているのが気持ち悪いほど,雷鳴がしている。

 夕べはギータの劇的なサヨナラホームランで勝った。球宴後,さあダッシュと思ったら,がっくりくる試合が続いて落ち込んでいたのだが,8月に入ってから,まあまあだ。何とか,5割復帰したし。上も抜け出せないでいるから,ここが踏ん張りどころだよー。鷹のみなさま,頑張ってちょうだい。

 ところで本題の方だが,いつも,buildとmakeはどう違うんだろうと思っていた。今回ちょっと気を入れてあちこち読み漁ってみたら,用語の発生した時期が違うだけで意味はあまり違わないらしいネ。少し,違う意味で使っているページもあるようだが,作業的にはだいたい同じことをやっているようだ。

 CentOS6の練習-#6で書いたように,すべてパッケージで済ませるかどうか悩んでいるが,それにしてもこの際buildの勉強は身を入れてやっておくべきだろう。今まで,実践でビルドにかかわったことはあっても,何やっているかなんて,あまりまじめに考えたことがない。コンパイルはやってるんだろうとか思ってたけど,リンクなんかの作業も入るんだねー。知らなかった。

 まっ,ありがちな「Hello, World!」の表示プログラムのbuildでもやってみるかな。今回の参照ページは,仕事で使える魔法のLAMPだけ。

  1. まずは,GCC(GNU Compiler Collection)のインストール。こういうところはパッケージを利用する(爆)。
    $ sudo yum install gcc gcc-c++
  2. $ vi hello.c
    で,/home/centosに,以下の内容で,hello.cを作成する。
    #include <stdio.h>
    main()
    {
    printf(“Hello, World!n”);
    }
  3. $ gcc hello.c -o hello
    で,コンパイルしてみる。-oオプションで実行ファイル名をhelloに指定。一瞬で終わるよ。
  4. $ ./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つの分けて,一つずつコンパイルした後,リンカを使って一つのファイルに仕上げる作業をやってみる。

  1. $ vi main.c  で,以下の内容のmain.cを作成する。
    main()
    {
    hello();
    }
  2. $ vi hello.c で,以下の内容のhello.cを作成する。この際,ひらがなの表示を試してみることにした。
    #include <stdio.h>
    hello()
    {
    printf(“こんにちは,みなさん!n”);
    }
  3. まず,main.cだけコンパイル。  $ gcc -c main.c
    lsで調べると分かるけど,この段階で  main.o  ができている。
  4. 次に,hello.cをコンパイル。  $ gcc -c hello.c
    これも調べると  hello.o  ができている。
    -cオプションのときは,「name」.c ⇒ 「name」.oというように.oのファイル名を決めるようだ。
  5. リンク作業。素のリンカ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を使った実行ファイルの作成。

  1. まず,ダウンロードのために wget をインストール。もっとも,自鯖の場合,この間のClamAVがらみでwgetは導入済み(汗)。
    $ sudo yum install wget
  2. 最新のGNU Helloをゲット。
    $ wget http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz
  3. 同じバージョンのシグネチャファイルもダウンロード。
    $ wget http://ftp.gnu.org/gnu/hello/hello-2.8.tar.gz.sig
  4. GnuPG(調べてみたら,gnupg2-2.0.14-4.el6.i686が,すでにインストール済みだった。)を使って,ファイルの正当性を確認する。
    $ gpg –list-keys    <<—  初回起動で,/home/centos/.gnupg が作成される。
    $ vi ~/.gnupg/gpg.conf
    で,中ごろにある keyserver-options auto-key-retrieve 行をアンコメントする。
  5. 以下のコマンドで,シグネチャの確認。
    $ 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
    ————————————————————————————————————————
  6. パッケージを展開し,展開されてできたディレクトリに移動する。その後,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も読む。
  7. $ 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  と実行してみた。
         世界よ、こんにちは!
    と表示された。完了!!!

 本日は,ここまで。

o6asan

Recent Posts

超手抜き、レンチン・ミキサー芋羊羹。

この秋よく作った芋羊羹のレシピ…

1年 ago

うー、久々にハマった。

 MariaDB の LTS …

2年 ago

あけましておめでとうございます。

ウサギ年ですねぇ。景気よく跳ね…

2年 ago

docomo の SC-02H 、 SIM ロック解除して Y!mobile で使う。

我が2台目のスマホとして SC…

3年 ago

o6asanの掲示板を引っ越し。-2

箱の準備が終わったので、中身を…

3年 ago

This website uses cookies.