2008年度機械情報冬学期演習...

13
1 2008 PC ラミ (1) [email protected] TA PC ラミ (1) http://www.jsk.t.u-tokyo.ac.jp/ ikuo/enshu/notepc/ http://www.isi.imi.i.u-tokyo.ac.jp/enshu/kikaiB/ 2008 10 3 10 8 1 演習の目的 3 ( ・メ ) ラミ ( ) 開発効率 イピ 1 PC 2 キーボードを使う ・・ イピ イピ ムポ F J ムポ ムポ イピ (Ctrl) ルフ 1 ブライ ブライ

Upload: others

Post on 15-Sep-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

1

2008年度 機械情報冬学期演習ノートPCプログラミング (1)

担当:水内 郁夫 講師 [email protected],山口 真奈美 技術専門職員

TA:情報システム工学研究室 修士一年(植木竜佑,白山翔太,太田茂樹,渡辺義明)ノート PCプログラミング (1):http://www.jsk.t.u-tokyo.ac.jp/∼ikuo/enshu/notepc/

機械情報冬学期演習:http://www.isi.imi.i.u-tokyo.ac.jp/enshu/kikaiB/

2008年 10月 3日10月 8日修正

1 演習の目的

3年冬学期の演習 (知能ソフトウェア演習・ロボットシステム演習・メカトロニクス設計演習)では,いままで講義で体験していたような単純なプログラミングではなく,ある程度複雑な実際的な

ソフトウェアシステムを構築することになる.その際 (あるいはそれ以降も),開発効率というのは非常に重要なファクターとなる.タッチタイピング1によってソフトウェアの開発効率が上がること

は容易に想像できるが,その他にも多くの基礎知識を用いることで開発の効率が著しく向上する.

本演習は,ソフトウェア開発を行ううえで必要となる,ノート PCの使い方の基本事項を習得し,今後の演習の円滑な進行のサポートを狙うものである.

2 キーボードを使う

何を当たり前な・・ と思うかもしれないが,タッチタイピングやショートカットの利用を身に

着けることは,初期の覚える過程というオーバーヘッドがあるが,それを身に着けた後の効率向上

の効果は大きい.

タッチタイピングで重要なのはホームポジションである.多くのキーボードには Fと Jのキーは触れるとわかるようになっており,ここにそれぞれの人差し指がくるホームポジションには,感触

だけで戻れるようになっている.何かキー操作をしたら毎回ホームポジションに戻るというのは,

タッチタイピングの初歩である.

コントロールキー (Ctrl)を押しながらアルファベットキーを押すというような操作によって,様々な機能を実行することができる.いわゆるキーボードショートカットと呼ばれる.ショートカット

を使うためには,様々なショートカットを覚えるという過程が必要だが,それを覚えることで作業

効率は向上する.

1「ブラインドタッチ」は和製英語であるが,広まっているので「ブラインドタッチ」の方が意味は通じやすい.

Page 2: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

2 2. キーボードを使う

一般にマウス操作というのはキーボード操作に比べて時間がかかる.マウス操作によりメニュー

から選択してという作業を短縮できることは,一つ一つの時間の短縮はわずかであっても,長期的

視点から見ると効果は大きい.小さくないオーバーヘッドをかけて小さな改善をすることは,たい

ていの場合正解である.

2.1 CAPSキーとCtrlキー

ほとんど使用する機会の無い Caps Lockキーがホームポジションから手を動かさなくて良い場所 (Aキーの隣)にあって,頻繁に使用するCtrlキーが遠い場所にあるのは合理的ではない.UNIX全盛の頃は Ctrlキーは Aの隣にあった.Hacker御用達の Happy Hacking Keyboard2は,もちろ

ん Ctrlキーは Aの隣である.貸し出されているノート PCでは,Capsキーを押しても Ctrlキーの役割をするように変更してある (Capsキーの機能を持つキーが無い状態).遠いCtrlキーに慣れてしまった人は修正するかどうか迷うところだが,そうでない人はCtrlキー

の押しやすさは重要な要素になるので,Aの隣を Ctrlキーにすることをお勧めする.ここでは,どうやって Capsキーを Ctrlキーの役割にしたかを紹介する.なお,Emacs(5節参照)では ESCキーも頻繁に使用するため,ESCキーと半角/全角キーを入れ替えることもしばしば行われる.

2.2 XKeymacs

貸出ノート PCには,XKeymacs3 というソフトがインストールされている.Capsキーを Ctrlキーの役割にする設定も,このソフトで行ってある4.このソフトは,Windows 上の全てのアプリケーションにおいて Emacs like な操作性を実現するためのキーボードユーティリィティである.XKeymacs を使用すれば,どの Windows アプリケーション上でも,Emacs のキーバインディングが利用できる.自分で作ったキーボードマクロに,任意のショートカットキーを割り当てること

もできる.コマンドプロンプト5で,bash のようにコマンドを補完することもできる.Windowsでは,コピーは Ctr-C,ペーストは Ctr-Vであるが,Emacsでは,コピーは ESC w,ペーストはCtr-Yである.ファイルを開くのは,WindowsではCtr-Oで,EmacsではCtr-X Ctr-Fである.XKeymacsは,Windowsのアプリケーションでも,Emacsのショートカットと同様のキー操作を可能にするツールである.Ctrキーの場所だけでなく,ショートカットキーを EmacsやMeadowと共通にしたい場合は,このソフトを起動してみると良い.

2.3 Linuxの場合

Linuxで Ctrlと Capsを入れ替える方法はいくつかある.貸し出しノート PCでは,メニューから「キーボード」というアプリケーション (gnome-keyboard-properties)を起動して,レイアウトの設定を修正してある.どのように設定してあるかを見てみるとよい.

2http://www.pfu.fujitsu.com/hhkeyboard/3http://www.cam.hi-ho.ne.jp/oishi/4レジストリ (Windowsの様々な設定を記憶する領域)を書き換えることでキーの設定を変更してあるので,XKeymacs

を起動しなくても Caps キーを Ctrl キーの役割になっている.5Windows についているシェル.COMSPEC という環境変数で実行ファイル (cmd.exe) が指定されている.

Page 3: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

2.4. ショートカットの覚え方 3

2.4 ショートカットの覚え方

膨大な量のショートカットを全て覚えるのは困難だが,マウス操作によりメニューから機能を選

択する際に多くのアプリケーションソフトでは,その機能のショートカットが記載されている.例

えば,Internet Explorer を起動して,ファイル (F)→開く (O)を見ると Ctrl+Oと記載されているし,Meadow(5節参照)では,File→Open File(C-x C-f)のように記載されている.メニューから選択する際にこれらの記載をキーボードショートカットで行ってみるということを心がけている

と,段階的に覚えていくことができる.

Emacsはカーソルを動かすのにも,C-f・C-b・C-n・C-p によって,右・左・下・上に動かすことができる (forward・back・next(line)・previous(line)).

3 Googleとman

演習中や,自分でプログラミングを試してみるような場合に,色々とわからないことが出てくる

だろう.そのような場合,まずは自分で調べてみることになる.今は検索エンジンの性能が素晴ら

しく向上しているので,http://www.google.com/等で検索しよう6.

また,Cygwinや Linux等でコマンドの役割やオプションを知りたい時は,manを活用しよう.

Linuxでは端末を開いて7,Cygwinでは Cygterm(スタートメニューにある)や Cygwinのアイコンをダブルクリックして,端末を開き,man gcc,man make,man ar,man objdump,man man

等々としてみよう.

4 Cygwin

Cygwin とは GNU8の開発ツールを含む,UNIXのさまざまなフリーソフトウェアをWindowsに移植したものであり,あたかもUNIXと同じような開発・実行環境が Windows の上で実現できるのが魅力となっている9.

4.1 環境設定

環境変数とは,変数と値でセットになってシステムに記憶されている設定で,子プロセス10に引

き継がれる.Cygwinのシェルである bashは,Windowsシステムの子プロセスなのでWindowsの環境変数を引き継いでいる.Windowsの環境変数を設定すると,Cygwinの内外でその環境変数が設定された状態になる.

Windowsの環境変数には,ユーザ環境変数とシステム環境変数がある.ユーザ環境変数はログオンしているユーザに固有の環境変数であり,システム環境変数はそのWindowsのどのユーザにも共通して設定される環境変数である.全てのユーザが実行しうるファイルのあるディレクトリ

6「ググる」と言う.7例えば背景を右クリックして「端末を開く」を選択すると「gonme 端末」が起動する.8URL は,http://www.gnu.org/ .GNU は GNU is Not Unix の意味 (再帰的定義)9UNIX は洗練された OS(とシステムツール群) でパーソナルコンピュータが普及する以前からコンピュータシステム

の標準的 OSとして利用されてきた一連の OSの総称である.Windowsに比べるとディスクやメモリの消費量が少なく軽快に動作する傾向がある.また,OSのソースからフリーであるものが多い.セキュリティ対策や安定動作にも優れているため (例えば数年間連続稼動等),サーバ系等では良く使われている.Linuxは,Linus Torvaldsが学生の時に作ったのが始まりで,UNIX 系の OS として一から書かれた比較的新しい OS であるが,現在では幅広く利用されている.

10子プロセスとは,あるプロセスから起動されるプロセスのこと.プロセスとは,プログラムの実行の単位である.

Page 4: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

4 4. Cygwin

は,システム環境変数の PATH11に設定するのが良いし,ログオンしているユーザのホームディレ

クトリはユーザ環境変数の HOMEを設定するのが良いだろう (mechuserの環境変数 HOMEは設定してある).

図 1: システムのプロパティ画面

Cygwinの実行ファイル群をWindowsからも使えるようにするには,Windowsの環境変数PATHに,Cygwinの実行ファイル群が置かれたディレクトリを追加する.マイコンピュータを右クリックしてプロパティを選択して,図 1 の丸で囲んだように,「詳細設定」のタグを選択し,下部の「環境変数」を選択する.次に,図 2の「システム環境変数」の中から PATHを選択し編集を押すか,ダブルクリックする.

変数名と変数値を入力する新しいウィンドウが出るので,変数名にPATH,変数値に C:\cygwin\bin

(\は半角の¥マーク) が含まれているかを確認しよう.PATHに複数のディレクトリを指定する場

合は,;で区切る.リストの最初にあるディレクトリから順に探索される.

自分で後から入れたコマンド等は,/usr/local/binに入れるのが,UNIXやCygwin(Windowsのディレクトリとしては C:\cygwin\usr\local\bin)の流儀なので,C:\cygwin\usr\local\binを環境変数 PATHに追加してみよう.現在の変数値の一番後ろに,「;C:\cygwin\usr\local\bin」

という文字列を追加して OKを押せばよい (;を忘れずに!:との区別も忘れずに!).すでに設定されているディレクトリを消したり変更してしまわないように注意すること.

後で自分で作成した実行ファイルを,/usr/local/binにコピーして,場所を指定しなくても実

行されることを確認しよう.Windowsのコマンドプロンプトからも実行できることを確認しよう(課題 1の後ろを参照).

11環境変数 PATH は,実行ファイル探索順を設定する環境変数

Page 5: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

4.2. .bashrc 5

図 2: 環境変数の設定画面

4.2 .bashrc

Linux では .cshrc や .bashrc などで環境変数を設定するが,Cygwin でも同名のファイルでCygwin内部で使われる環境変数を設定できる.前節での設定は,Cygwin が立ち上がっていない状態で,Windows に Cygwin のコマンド場所を教える意味があったが,Cygwin 環境の中での環境変数は˜/.bashrc で管理する.配布した段階では,環境変数 HOMEはWindowsのユーザ環境変数として設定され C:\cygwin\home\mechuser となっている.

なお,Cygwinの中で PATHの区切りは:であること,Windowsの C ドライブは Cygwinの中では/cygdrive/C/としてアクセスできること,ディレクトリの区切りがWindowsでは\(半角の¥)

でCygwinでは/であること,Windows の PATHはディレクトリ名に空白があっても良いがCygwinの PATHは空白文字の前に\を置きエスケープする必要があること,などの違いがあるので注意する.

基本例として,配布されている.bashrcファイルを Meadow(スタートメニューから Meadow2を選べばよい)で開いて見てみよう.環境変数の設定は,export 変数名=値とする.aliasとは別

名を設定する.source ファイル名は,ファイル名のファイルを読み込む..bashrcの最下行に,

source ~/.my-settingsという行を追加しよう.自分で設定した内容を~/.my-settingsという

ファイルに分けておくと,この行をコメントアウトすれば12,初期設定に戻すことができる.

12先頭に#をつけるとコメント行になり実行されない

Page 6: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

6 5. Meadow

◇ 確認作業 ◇¶ ³

上記の.bashrcを設定し,~/.my-settingsというファイルを作成しよう.作業はスター

トメニューからMeadow2を起動して行うとよい.~/.my-settingsに,

alias me=/cygdrive/c/Meadow/bin/Meadow.exe

と書いてみよう.

Cygwinを起動しなおして,meと入力すると,Meadowが起動すれば,設定はうまくいったということである.

µ ´

5 Meadow

Meadowとは,Windowsに移植され,機能も強化された Emacsのことである13.LinuxでEmacsの使用を推奨するとともに,Windows でソフトウェアを開発する場合にも,同様に Meadow の使用を推奨する.双方を習得すれば,OSの違いによってインタフェースの違いに苦しむこともなくスムースに開発環境をスイッチすることが可能である.

5.1 .emacs

~/.emacsは,MeadowやEmacsの起動時読み込まれるファイルである.Meadowから~/.emacs

を開いて,どのような設定があるのかを眺めてみよう.EmacsやMeadowが読み込むファイルは,EmacsLispという Lisp言語で記述されている.Meadow特有の設定は,~/.meadowに書いてある

ので,こちらも開いて見てみよう.

◇ 確認作業 ◇¶ ³

~/.emacsの後ろの方に,

;;; M-x g goto-line

;;; デバッグをする際にこれがあると便利である

(define-key esc-map "g" ’goto-line)

という行を追加しよう.そして,Meadow を起動しなおして,~/.emacs を開き,M-g

(ESCキーを押して離して gキーを押す)と入力し,行番号を指定すると,指定した行へジャンプすることを確認しよう.

µ ´

13http://kawacho.don.am/win/meadow/index.html などに詳しい説明がある.

Page 7: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

5.2. Meadow上の shell 7

5.2 Meadow上の shell

Meadow 上で Cygwin の bash を立ち上げることができる.Meadow 上で,M-x shellと打ち込む(ESCキーを押して離して x を押し,shellと入力する)と,普通の Cygwin の画面と同様のコマンドプロンプトが Meadow に表示されることが分る.あとは通常と同じようにコマンドを打ち込み,実行することができる.このモードを「shellモード」と呼ぶ.shellモードの利点は,プログラムの実行結果やデバッグ文等のメッセージ表示が,エディタ上に残るので,その部分をコピーペーストしてレポートを作成したり,メールで転送したりする

などの作業が容易にできる点である.

コマンドの履歴を参照する場合,通常の Cygwin の bash では C-p,C-nであるが,Meadow のshellモードでは,M-p,M-nである.

なお,上記の設定を行わないまま,シェルを立ち上げようとすると,Cygwin の bash ではなく,Windows のコマンドプロンプトが立ち上がってしまう.似たような画面であるが,コマンドプロンプトでは演習を進めることはできないので注意が必要である.

◇ 課題 1 ◇¶ ³

Meadowで下の test0.cを作成し,Meadowのシェルで右下のコマンドを実行せよ.それぞれの行が何をしているかを考えよ.Meadow 上のシェルの上から,下の test0.c(各自アレンジして構わない)から生成されるプログラムの実行を行い,その結果を表示させよ.

¶ ³/* test0.c */#include <stdio.h>

int test(int i, int j) {return (i * j);

}

main(int argc, char *argv) {int i,j,k;i = 3;j = 2;k = test(i,j);if (k > 5) printf(">5\n");else printf("<=5\n");

}µ ´

¶ ³$ ls

test0.c

$ gcc -S test0.c

$ cat test0.s

$ gcc -c test0.c

$ objdump -d test0.o

$ gcc -o test0.exe test0.o

$ nm test0.o

$ nm test0.exe

$ ls

test0.c test0.exe test0.o test0.s

$ ./test0.exeµ ´

µ ´

※課題 1で実行したコマンドの意味は,以下のとおり.

• gcc -S … Cプログラムをアセンブリ言語に変換

• gcc -c … バイナリ(機械語ファイル)に変換

• gcc -o … 出力ファイルの指定

• gcc … 実行ファイル生成(必要に応じてコンパイル・リンク)

• nm … シンボル(関数・変数)のアドレス一覧を出力

• objdump -d … 逆アセンブル(機械語からアセンブリ言語を生成)

Page 8: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

8 5. Meadow

さらに,4.1節で設定した PATHが有効に働くかを確認するために,自分で作成した実行ファイ

ル test0.exeを,

cp test0.exe /usr/local/bin

のようにして/usr/local/binにコピーして,

cd ~

test0.exe

として,/usr/local/bin/test0.exeが見つけられて実行されることを確認しよう.Windowsのコマンドプロンプト (スタートメニューのアクセサリから開ける)を起動し,test0.exeと入力し

て,どのディレクトリからでも実行できることを確認しよう.

Page 9: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

9

6 Makefile 復習!

今後,演習を進めていくに当たって,Makefile は必須の知識となる.良く分っていない人は今回でマスターしてしまおう (計算機演習でも使われてきた).

6.1 Makefile基本

Makefile のルールの基本は次の形である.¶ ³ターゲット:依存するファイル

コマンドµ ´コマンドラインから¶ ³make (ターゲット)

µ ´とすることで,「ターゲット」が存在しない,あるいはターゲットよりも新しい「依存するファイ

ル」場合にコマンドが実行される.また,コマンド行の始まりは必ずタブコードを書く.したがっ

て test1 が main.c と hello.c からコンパイルされる場合は以下のように記述する.¶ ³test1.exe: main.c hello.c goodbye.c

gcc -o test1.exe main.c hello.c goodbye.cµ ´これでコマンドラインから以下のように打ち込めばコンパイルができる.¶ ³% make test1.exe

gcc -o test1.exe main.c hello.c goodbye.cµ ´

◇ 課題 2 ◇¶ ³

http://www.jsk.t.u-tokyo.ac.jp/∼ikuo/enshu/notepc/sample.tar.bz2 に ,

main.c, hello.c, goodbye.c の sampleがある.実際にMakefileを作って,6.1節を試してみよう.

µ ´

6.2 依存関係の記述

上の例では hello.cが更新された場合でも main.cや goodbye.cのコンパイルが行われてしまい,非効率である.これを回避するためには以下のように main.c から main.o を作るルールと, hello.cから hello.o を作るルールと, goodbye.c から goodbye.o を作るルールとMakefileに書き, test2は hello.o と goodbye.o と main.o から作られるようにする.そうすると,hello.cが更新された場合,make test2とすると hello.cのみ再コンパイルされ,不要なmain.cや goodbye.cの再コンパイルは行われない.

Page 10: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

10 6. Makefile 復習!

¶ ³test2.exe: main.o hello.o goodbye.o

gcc -o test2.exe main.o hello.o goodbye.o

main.o: main.c

gcc -o main.o -c main.c

hello.o: hello.c

gcc -o hello.o -c hello.c

goodbye.o: goodbye.c

gcc -o goodbye.o -c goodbye.cµ ´

6.3 自動変数

ルールを書くときに同じことを何回も書くことを避けるために,自動変数が用意されている.¶ ³test3.exe: main.o hello.o goodbye.o

gcc -o $@ $^

main.o: main.c

gcc -o $@ -c $^

hello.o: hello.c

gcc -o $@ -c $^

goodbye.o: goodbye.c

gcc -o $@ -c $^µ ´

$@ ターゲットのファイル名,$^は依存するファイル名であるため,この makefileは上の例と同じことになる.

$% ターゲットがアーカイブメンバだったときのターゲットメンバ名

$< 最初の依存するファイルの名前

$? ターゲットより新しいすべての依存するファイル名

$^すべての依存するファイルの名前

$+ Makefileと同じ順番の依存するファイルの名前

$* サフィックスを除いたターゲットの名前

さらに,ファイル名.cからはファイル名.oを作るルールは,次のように書ける.¶ ³%.o: %.c

gcc -o $@ -c $<µ ´こうすると汎用なルールになり,Makefileは以下のように4行でシンプルに書くことができる.

Page 11: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

11

¶ ³test4.exe: main.o hello.o goodbye.o

gcc -o $@ $^

%.o: %.c

gcc -o $@ -c $<µ ´

Makefileは奥が深いので,色々と調べてみると良い.たとえば,岡田慧先生のホームページhttp://www.jsk.t.u-tokyo.ac.jp/∼k-okada/makefile/ は参考になるだろう.

7 etags

プログラムを読み書きする場合,良く使うことになるのが,文字列検索による関数の参照であ

る.例えば,以下のようなプログラムコードがあった場合,プログラムの流れを把握するために

は,main から func1 ,func1 から func2 という具合に,実行されるプログラムコードを追いかけて行くことになる.長いプログラムになった場合や,複数のファイルに分散させてプログラムを書

く場合を考えると,すばやく検索ができない,という問題が生じる.

そこで開発されたのが etags である.etags コマンドはソースコードの中に含まれる変数名や関数名を全てリストアップしどこで定義されているか,という情報を TAGS というファイルに記録する.この TAGS ファイルを参照することによって,「この関数の中身が見たいが,どこで定義されているのか?探すのが面倒だ!」という問題を解決することができる.

7.1 etags の使い方

課題 2でダウンロードしたパッケージがあるディレクトリ (sample)に移動し,

¶ ³$ etags *.c*µ ´

とする.(注意:$ というのはコマンドプロンプトのことである.入力しないように!)すると,TAGS

というファイルが作製されていることが分る.次に,Meadow (or emacs) で main.cを読み込ん

で,実際に使ってみる.¶ ³int main(int ac, char *av[]) {

printf("This is the main.\n");

hello();

goodbye();

return 0;

}µ ´helloというのが一体何なのか?が分らないとソースコードの意味を理解することができない.そ

こで hello の上にカーソルを合わせ,M-.とする.すると,「Find tag: (default hello)」と表

示され,調べたい変数などに間違いがないか確認を求められるので,正しければ Enterを押す.次に,「Visit tags table: (default TAGS) .../sample/」という表示が出るので,TAGS ファイルが置かれているディレクトリを指定する.すなわち,

「.../sample/TAGS」という具合に表示されているファイル名を書き換えて,Enterを押す.(TAGS

Page 12: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

12 8. ライブラリの作製

ファイルの場所の指定は一回行えば,次からは自動的に認識される.)ファイルが切り替わり,hello.c

のソースコードが現れる.そして,カーソルは,hello という関数が定義されている行にジャンプ

する.

このように,変数の型を調べたい,クラス定義やメソッドの中身を参照したい,という場合に,

etagsは有用なツールとなる.単純にソースコード全体に対して探索コマンドでを使用しても,メ

ソッド関数を呼んでいる場所を除いて,定義をしている場所を探す,ということは不可能である.

なお,時々複数のファイルを一度に閲覧するために,複数のMeadow を立ち上げている人を見かけるが,この etags の機能を使いこなすことを考えるとナンセンスな使い方であることが分る.Meadowのバッファ機能を使いこなして欲しい.

8 ライブラリの作製

大規模なプログラムを作成する場合,何度も使いまわす基本的な関数はライブラリとしてまとめ

ておくのが有効である.ライブラリは Cygwin では拡張子 dll を付け,Linux では拡張子 soを

付けるのが習慣となっている.さらに,基本の名前の部分についても,例えばライブラリの名前が

funcであれば,libfuncd.dll(又は libfuncd.so) という具合に,頭に libを付ける習慣がある.

8.1 ライブラリの作製とリンク

ライブラリを作製する場合のコンパイルオプションは以下のようになる.¶ ³$ gcc -shared -o libfuncd.dll func.o

µ ´ただし,func.o は -c オプションでコンパイルされたオブジェクトファイルである.-sharedは

共有ライブラリ (shared library)を生成するオプションで,これで生成された libfuncd.dllは,

様々な実行ファイルから呼び出して使うことができる.

ライブラリをリンクする場合は,以下のようなオプションでリンクを行う.¶ ³$ gcc main.o -o main.exe -L. -lfuncd

µ ´ここで,-L オプションは,ライブラリの置いてあるディレクトリを指定するリンカオプションで

あり,-l オプションはライブラリの名前の指定を行うリンカオプションである.上の例では,-L

オプションで,現在のディレクトリ ( . ) が指定されており,ライブラリの名前として,funcd が

指定されている.この場合,結果として ./libfuncd.dllをライブラリとしてリンクすることと

なる.

gcc (および g++)は基本的にはコンパイラであるが,リンカとしても動作するので,混乱しないように注意する必要がある.

8.2 ライブラリの種類

ライブラリのファイルには,静的ライブラリ (static library)と動的ライブラリ (dynamic library;共有ライブラリとも呼ぶ)がある.前者は .a という拡張子が付くもので,後者は.dll ないし.so

が付く..aは archiveの略で,複数のオブジェクトファイルに含まれている関数をまとめた大き

Page 13: 2008年度機械情報冬学期演習 ノートPCプログラミング(1)ikuo/enshu/notepc/notepc-20081003.pdfまた,Cygwin やLinux 等でコマンドの役割やオプションを知りたい時は,man

8.2. ライブラリの種類 13

な一つのオブジェクトファイルであると理解すれば良い..dll,.so は Dynamic Link Library ,Shared Object の略で,「動的」にオブジェクトがリンクされるのが特徴である.静的,動的の違いは,.exeの拡張子が付く実行ファイルの中に使用するライブラリオブジェクトが含まれるか否か,

にある.静的ライブラリはリンクした段階でオブジェクトが実行ファイルに内蔵されるが,動的ラ

イブラリは実行ファイルには実体が含まれず,どこか別の場所のファイルとしてリンクされている

だけである.実行時に実体のライブラリファイルが呼ばれる.よって,実行ファイルが作製された

後に,リンク先のライブラリファイルが何らかの理由でなくなったり,名前が変更になったりする

と,とたんに動作できなくなる.というデメリットがある.その代わりに実行ファイルのサイズが

小さくて済む,というメリットもある.

静的ライブラリを作製するコマンドは arで,方法は以下の通りである.¶ ³$ ar cq libfunca.a func1.o func2.o ....

µ ´

◇ 課題 3 ◇¶ ³

1. hello.o と goodbye.o を含むライブラリ,libfuncsd.dll と libfuncsa.aを作製

せよ.

2. libfuncsa.a をリンクする main_a.exe と libfuncsd.dll をリンクする

main_dll.exeを作製せよ

3. 上記の二つを自動実行する Makefile を作製せよ

4. 双方の実行ファイルについて,cygcheck と ls -lを用いたファイルサイズの確認

を行え.

µ ´

◇ アドバンスト課題 ◇¶ ³

今日の課題 2 及び課題 3 を,Linux でも行ってみよ.Linux では,gnome 端末を開き,emacs として Emacsを起動すると良い.

µ ´

◇ 提出物 ◇¶ ³

課題 1 と課題 3 の結果を簡単にテキストファイルにまとめ,[email protected] までメールすること.subject は「ノート PC 演習 1-xxxxx-1003」とすること.xxxxx は学生証番号を当てはめること.メール本文にも,学生証番号と氏名を必ず書くこと.メールをした後,提出した事を告げて出席チェックとする.

アドバンスト課題を行った場合は,結果や Cygwinとの違い等を同じアドレスにメールすること.subjectは「ノート PC演習 1-adv-xxxxx-1003」とする.

µ ´