[分割コンパイルの復習]

全文

(1)

13

[分割コンパイルの復習]

cc ‑c sample.c

(sample.oというオブジェクトファイルを生成)

cc ‑c sub1.c

(sub1.o  というオブジェクトファイルを生成)

cc ‑c sub2.c

(sub2.o  というオブジェクトファイルを生成)

cc ‑o sample sample.o sub1.o sub2.o 

(sample.o sub1.o sub2.oの

3

つをリンク

して

sample

という実行ファイルを生成)

上の

4

行は

  cc ‑o sample sample.c sub1.c sub2.c 

と同じ.

1)

開発時のコンパイル時間の短縮

2)

汎用的関数やサブルーチンの再利用が可能

3)

関数,変数の通用範囲(スコープ)の制限が可能 という利点があり,

1)

多人数でのプログラム開発(OSなど)

2)

大規模なプログラム開発 などのときに使う.

11.Make

Makefile

または

makefile

というファイルに分割コンパイル時のファイルの依存関係と処

理方法を記述.

部分的な変更があった場合,変更が及ぶ範囲だけを処理する.

ファイル include しているヘッダ

sample.c

config.h inc1.h inc2.h sub1.c

config.h inc1.h

sub2.c

config.h inc2.h  makefile

の例

---<ここから>---

# 簡単な makefile の例 

all: sample   

sample: sample.o sub1.o sub2.o 

        cc ‑o sample sample.o sub1.o sub2.o   

sample.o: sample.c config.h inc1.h inc2.h          cc ‑c sample.c 

 

sub1.o: sub1.c config.h inc1.h          cc ‑c sub1.c 

 

sub2.o: sub2.c config.h inc2.h          cc ‑c sub2.c 

---<ここまで>---

トップレベルのターゲット

(2)

14

[書式]

作りたいファイル:必要なファイル と 依存関係

(TAB)ファイルを作るのに必要なコマンド

上の

makefile

sample.c sub1.c sub2.c config.h inc1.h inc2.h

と同じディレクトリ におき,

  make 

と入力すると

cc ‑c sample.c  cc ‑c sub1.c  cc ‑c sub2.c 

cc ‑o sample sample.o sub1.o sub2.o 

が実行される.

このあと

a) sample.c

だけを変更したとき,makeと入力すると

cc ‑c sample.c 

cc ‑o sample sample.o sub1.o sub2.o 

b) sub1.c

だけを変更したとき

cc ‑c sub1.c 

cc ‑o sample sample.o sub1.o sub2.o  c) inc2.h

だけを変更したとき

cc ‑c sample.c  cc ‑c sub2.c 

cc ‑o sample sample.o sub1.o sub2.o 

d) config.h

だけを変更したとき

cc ‑c sample.c  cc ‑c sub1.c  cc ‑c sub2.c 

cc ‑o sample sample.o sub1.o sub2.o 

がそれぞれ実行される.

[補足と参考]

• sub1.o

だけを生成したいときは

    make sub1.o 

と入力すればよい.

上の

makefile

sample.make

というファイル名で作成したときは

    make ‑f sample.make 

と入力すればよい.

• makefile

の中では変数が使用可能.

(3)

15

(例)

OBJ = sample.o sub1.o sub2.o  INC = config.h inc1.h inc2.h  LIB = ‑lm 

 

sample: $(OBJ) 

        cc ‑o sample $(OBJ) $(LIB)   

sample.o: sample.c $(INC)          cc ‑c sample.c   

sub1.o: sub1.c config.h inc1.h          cc ‑c sub1.c 

 

sub2.o: sub2.c config.h inc2.h          cc ‑c sub2.c 

make

のより高度な利用法については各自で調べて下さい.

12.変数の通用範囲(スコープ)

[プログラムがひとつのファイルからなる場合]

a) {  } の中で宣言された変数(自動変数)

{  } の中でのみ領域が確保される

void main(void){ 

  int a; 

}   

void sub1(void){ 

  int a; 

{  } の外でも領域を確保するには static

を付けて宣言する.

static int a; 

b)

関数(

{  } )の外で宣言された変数(大域変数)

ファイル全域で領域が確保される.ただし自動変数と重なった場合は自動変数が優 先される.

ひとつのファイルからなる場合

static

を付けても動作に変化はない.

{  } の中で extern

を付けて宣言すると大域変数を参照する.

***演習***

下のプログラム例の《 (ア) 》の行を

①int a;   ② extern int a;  ③ 何も書かない として実行し,それらの結果を比較せよ.

(cc ‑o sample sample.o sub1.o sub2.o –lmと同じ)

この2つの

a

は無関係

(4)

16

#include <stdio.h> 

int a; 

void sub1(void); 

 

void main(void){ 

  a=0; 

  printf("%d¥n",a); 

  a=2; 

  printf("%d¥n",a); 

  sub1(); 

  printf("%d¥n",a); 

[2つ以上のファイルからなる場合]

a)

自動変数については1ファイルの場合と同じ

b)

他のファイルにある大域変数を参照するには

extern

を付けて宣言する.

      extern int a; 

大域変数に

static

を付けて宣言すると他のファイルから参照できなくなる.

static

を関数宣言に付けると他のファイルからその関数を呼べなくなる(名前が重

なってもよい). レポート課題

9.a)課題6,7で作成した,Newton法のプログラムを,分割コンパイルにより作成す

makefile

を作成せよ.

b)上の演習の例を参考にして,2つ以上のファイルからプログラムが構成される場合

に,変数を

① ふつうに宣言する

extern

を付けて宣言する

static

を付けて宣言する

これら3つの場合の結果が違うような,簡単なプログラムを作成せよ.

10.a)一実変数の方程式

f(x) = 0

に対する二分法は,f(a)

> 0,f(b) < 0

であるような2点

a, b

を選び(a

< b

であってもよい),

a ≈ b

となるまで,以下の手続きをくり返す.

c = (a+b)/2

if f(c) > 0 then a = c else if f(c) < 0 then b = c

このプログラムを作成せよ.

b)二分法と,ニュートン法を用いて cos x − x = 0

の解を求めよ.また,二つの方法

の比較をおこないなさい.

締 切

   :1月11日(火)午後4時(期限厳守)

提出先:システム事務室

void sub1(void){ 

《  (ア)  》 

  a=100; 

Updating...

参照

Updating...

関連した話題 :