2012年10月26日金曜日

Makefile の細かい挙動の違い

Makefile を使っているが、SDPA-C のインストール用のものを書いていて、以下の2つに違いがあることに挙動に気が付いた。

[1]
OBJ = a.o b.o
CC = gcc
main.exe : main.o (OBJ)
   $(CC) -o $@ main.o $(OBJ)

[2]

main.exe : main.o $(OBJ)
   $(CC) -o $@ main.o $(OBJ)

OBJ = a.o b.o
CC = gcc

このとき、[1] では問題ないが [2] はバグとなる。
どうやら、変数の評価は、ファイルが存在するかどうかを確認する、つまり
main.exe : main.o $(OBJ)
の段階では上n行に書かれている $(OBJ) のみを参照するのに対して、
   $(CC) -o $@ main.o $(OBJ)
の段階では、Makefile の最後まで読んで最後に指定されたものを利用する。
つまり、[2] では、以下のように展開されるようである。
main.exe : main.o
   gcc -o main.exe main.o a.o b.o

ちょっとした違いだが、片方はバグになるので気をつけなければならない。

今日の作業内容:SDPA-C 1h
今日のランチ:シッダルータ ベジタブルカレー
明日の予測作業時間:4h


0 件のコメント:

コメントを投稿