オペレーティングシステム2

情報工学科 3年生対象 専門科目
システムプログラミング
第3回
makeコマンド
動的リンクライブラリ
情報工学科
篠埜 功
開発支援ツール make
• コンパイルを要するソースファイルの数が多くなった場合,手
間がかかる
• 1つのヘッダファイルを複数のソースファイルで使用している
場合,ヘッダファイルの修正→ 関連する全てのソースファイ
ルの際コンパイル
• makeを使用
– ファイルの変更をした場合、その影響を受けるファイルを
再コンパイルする。(不要な再コンパイルをしない)
– ファイルの日付情報を用いる。
Makefile
• ファイルの作成方法を記述したルール
– コロンの前にmakeで作成するファイル名前を書く。
– コロンの右にコロンの左のファイルを作るために必要なファイルをス
ペースで区切って並べる
– 次の行以下にそのファイルを作るためのコマンドをTABキーを押し
たあとに記述。2つ以上のコマンドを書いてもよい。
(例)
TAB
main : main.o add.o mult.o
gcc -o main main.o add.o mult.o
main.o : main.c addmult.h
gcc -c main.c
add.o : add.c
gcc -c add.c
mult.o : mult.c
gcc -c mult.c
make
• さきほどの例を内容とするMakefileというファイルを作成し、
$ make
を実行する。この場合、Makefileの一番上のmainを作成しようとする。
main : main.o add.o mult.o
gcc -o main main.o add.o mult.o
main.o : main.c addmult.h
gcc -c main.c
add.o : add.c
gcc -c add.c
mult.o : mult.c
gcc -c mult.c
make
さきほどの例で、add.cやaddmult.hなど、ソースファイルの
内容を変更し(スペースやコメントを入れるなど)、
$ make
を実行して何が起きるか確認せよ。
(参考) touchコマンドを使うと、中身を変えずにファイルの
時刻情報のみ更新できる。
$ touch add.c
など。
make
$ make add.o
などと、コロンの左側のものをmakeの引数に与えると、それ
を作成しようとする。
main : main.o add.o mult.o
gcc -o main main.o add.o mult.o
main.o : main.c addmult.h
gcc -c main.c
add.o : add.c
gcc -c add.c
mult.o : mult.c
gcc -c mult.c
Makefile
• コロンの左に書くのはファイル名でなくてもよい。
test1:
ls –l
test2:
ps –ef | grep sasano
$ make test1
とするとファイル一覧が表示され、
$ make test2
とするとプロセス一覧からsasanoを含む行を抜き出したもの
が表示される。
(注意) もし、test1, test2という名前のファイルがそのディレ
クトリに存在している場合は、別の名前にしてください。
make
clean というターゲットを作っておき、実行コマンドとして不要な
ファイルを削除するコマンドを書いておくということがよく行われる。
$ make clean
とすると、ソースファイルではないファイルが削除されてディレクト
リがきれいになる。
main : main.o add.o mult.o
gcc -o main main.o add.o mult.o
main.o : main.c addmult.h
gcc -c main.c
rm に-fオプションは
add.o : add.c
強制削除のオプ
gcc -c add.c
ションであり、存在
しないファイルが引
mult.o : mult.c
数にあたえられても
gcc -c mult.c
メッセージが出ない。
clean :
rm –f main main.o add.o mult.o
Makefileの名前について
Makefileの名前は”Makefile”でなくてよい。
makeコマンド(GNU make)はdefaultでは”GNUmakefile”,
“makefile”, “Makefile”をこの順で探し、最初に見つかった
もので実行する。これ以外のものを使いたい場合は-fオプ
ションで指定する。たとえばmyMakefileという名前で
Makefileを作成したときは、
$ make –f myMakefile
のように実行すればよい。
練習問題
前回のlibaddmult.aを作ってからmainを作成する手順を
makeコマンドで行えるようにMakefileを作成せよ。
マニュアル表示コマンド man
• (例) gcc, ar, makeコマンドについて調べたい
$ man gcc
$ man ar
$ man make
• コマンドの処理内容,様々なオプションの解説が書か
れている。
• manコマンドについては
$ man man
で調べる。
共有ライブラリ(shared library)
• 動的リンクライブラリ(dynamic link library)とも言う。
• 実行形式ファイルにはライブラリの中身は含まれず、
実行時にリンクされる。
• 実行形式ファイルのサイズの削減
• ライブラリを修正する場合、ライブラリファイルのみ修
正すればよく、リンク作業が不要。
共有ライブラリ作成例
さきほどのadd, mult関数の例で共有ライブラリを作成する。
$ gcc –fPIC –shared –o libaddmult.so add.c mult.c
これでadd, mult関数が共有ライブラリとしてlibaddmult.soに作成さ
れる。
$ gcc –L. –o main main.c –laddmult
(あるいは $ gcc –o main main.c libaddmult.so と明示的に指定)
これでlibaddmult.soが実行時にリンクされるようになる。
$ ./main
を実行する前に、
$ setenv LD_LIBRARY_PATH .
を実行しておく(シェルがtcshの場合)。シェルがbashの場合は、
$ LD_LIBRARY_PATH=.; export LD_LIBRARY_PATH
とする。add.cを変更してlibaddmult.soを作り直し、mainを実行する
と、mainを作成しなおさなくても変更が反映されていることが分かる。
$ ldd main
(lddはlist dynamic depencenciesの略)
で、mainが動的にリンクするファイル一覧が表示される。
補足
• -lxxx でリンクする際には、libxxx.soが先に検
索される。
(例)/usr/lib/libm.so, /usr/lib/libm.aのように
両方ある場合は/usr/lib/libm.soが(defaultで)
使われる。
レポート課題1
1.
2.
3.
4.
5.
6.
長さnのint型の配列の各要素に1から100までの整数をランダムに作成して
代入する関数randAssignを定義したファイルrandAssign.c
長さnのint型の配列を受け取り、要素を小さい順に並べ替える関数sortを定
義したファイルsort.c
randAssign関数のプロトタイプ宣言を記述したファイルrandAssign.h
sort関数のプロトタイプ宣言を記述したファイルsort.h
以下の内容のmain関数を記述したmain.c
–
長さnの配列を作成し、それをrandAssign関数に渡して整数をランダムに
格納させ、sort関数に渡してソートをさせ、その結果を画面に出力するプ
ログラム。長さnの値はmain.cに直接書いてよい。キーボードから入力す
るようにしてもよい。
–
main関数の先頭部分でrandAssign.h, sort.hを読み込む。
Makefile
–
実行形式ファイル(mainとする)をmakeコマンドで作成できるように作成す
る。
配列を関数に渡すとき、長さをもう一つの引数として
渡す。
レポートの提出方法
□ 下記のファイルを作成し、提出
• randAssign.c, randAssign.h, sort.c, sort.h, main.c,
Makefile, kadai1.txt
□ 提出方法
システムプログラミング講義用の課題提出用フォルダ内に
あるkadai1というフォルダの中に自分の学籍番号を名前と
するフォルダを作成し、その中に上記ファイルを置く。
kadai1.txt内に学籍番号、氏名、日付、および作成したプ
ログラムの簡単な説明を記載する。
□ 提出期限
11月1日 23:59 まで。締め切り後に提出した場合、成績へ
の反映を保証しない。
□ アーカイブを作る必要はありません(作ってもいいですが)。
□ 動的リンクにするか静的リンクにするかについても自由。