情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功
開発支援ツール make コンパイルを要するソースファイルの数が多くなった場合,手間がかかる 1つのヘッダファイルを複数のソースファイルで使用している場合,ヘッダファイルの修正→ 関連する全てのソースファイルの際コンパイル makeを使用 ファイルの変更をした場合、その影響を受けるファイルを再コンパイルする。(不要な再コンパイルをしない) ファイルの日付情報を用いる。
Makefile (例) ファイルの作成方法を記述したルール main : main.o add.o mult.o コロンの右にコロンの左のファイルを作るために必要なファイルをスペースで区切って並べる 次の行以下にそのファイルを作るためのコマンドをTABキーを押したあとに記述。2つ以上のコマンドを書いてもよい。 (例) 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 TAB
make さきほどの例を内容とするMakefileというファイルを作成し、 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 main : main.o add.o mult.o gcc -o main main.o add.o mult.o $ 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 コロンの左に書くのはファイル名でなくてもよい。 test1: ls –l test2: ps –ef | grep sasano $ make test1 とするとファイル一覧が表示され、 $ make test2 とするとプロセス一覧からsasanoを含む行を抜き出したものが表示される。 (注意) もし、test1, test2という名前のファイルがそのディレクトリに存在している場合は、別の名前にしてください。
make main : main.o add.o mult.o gcc -o main main.o add.o mult.o 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 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 rm に-fオプションは強制削除のオプションであり、存在しないファイルが引数にあたえられてもメッセージが出ない。
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 配列を関数に渡すとき、長さをもう一つの引数として渡す。 長さ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 まで。締め切り後に提出した場合、成績への反映を保証しない。 □ アーカイブを作る必要はありません(作ってもいいですが)。 □ 動的リンクにするか静的リンクにするかについても自由。