プロが教えるわが家の防犯対策術!

標題のようにWindows7のコマンドラインでnmakeを利用したいと思います。ソースプログラムを作成してコンパイルするということが基本だと思っています。
例えば、wave.fというフォートランのソースをgfortranでコンパイルしてwave.oというオブジェクトファイルを作成し、wave.exeを生成するというような動作をmakefileで実行する実験をしているのですが、エラーとなります。

○ 以下に test.mak というmakefileを作成しました。いろんなサンプルファイルを参考にしてこのような動作かなと思って作成しました。右の←以下は私はこういうつもりで書いたというものです。

FC = gfortran          ←コンパイラ
FFLAGS = -Wall ←オプション
objects=wave.o         ←オブジェクト名
#
wave: $(objects)
$(FC) $(FFLAGS) $(objects) -o wave←コンパイル
#
wave: $(objects) ← オブジェクトファイルを集めて実行ファイルを作成する。
#
clean :       ← はじめからやり直すためにオブジェクトファイルを削除する(クリーンにする)。
rm *.o    ← 削除

○実行
nmake test.mak あるいは
nmake -f test.mak などです。

結果は、NMAKE: fatal error U1073: 'wave.o'のビルドの方法が指定されていません。stop.

gfortran -Wall wave.o -o wave というところが、オブジェクトファイルwave.oを使って実行ファイルwaveを作成するという意味なので、wave.fというファイルを探しだしてコンパイルしてwave-oを生成する、という筋書きになっていると思っていました。

昔からmakeが苦手なのでちょっと時間を取って考えているところです。

test.makのどこが間違っているのでしょうか。添削をお願いしたいのですが。

よろしくお願いします。Cのカテゴリの方も十分ご存知かと思ったのでこちらに書きました。

A 回答 (3件)

Visual Studioは使ったことありますか?


プロジェクトに、ソースファイルと、それが依存するヘッダファイルを追加して、プロパティから他のオプションとかを設定して、ビルドを実行して実行ファイルを作ります。
通常ビルドを実行すると、前回から変更されたファイルだけビルドが実行されます。
クリーンを実行すると、中間ファイルが削除されます。

かなり大雑把に言うと
プロジェクトを作成して設定する→ Makefile を書く
ビルド→ make コマンドの実行
クリーン→ make cleanの実行(Makefileにcleanルールが適切に記述されている場合)
です。


1つ2つ程度のソースファイルだけなら、直接コマンド入力しても大したことはありません。
ですが、大きなプロジェクトとなると、何十何百ものソースファイルから構成されています。
これを一つ一つコンパイルするのは非常に面倒です。
a.c,b.c,c.cからd.a (ライブラリ)を作って、 e.c, f.cをコンパイルした e.o,f.oとd.aをリンクして g.exe にする、等といった複雑な関係になっていることもしばしばです。
全行程をシェルスクリプト/バッチファイルにしてもいいですが、それだと、1つ修正しただけでも全部コンパイルしなおすので非効率的です。

そこで
・コンパイルの手順を示す
・必要な分だけコンパイルする
・コンパイル実行は少ない手順で行う
ということを実現するのが、make等のコマンドや、VisualStudioのプロジェクトです。



> $(FC) $(OPTIONS) -o abcd $(objects) ←このような記述がありますが、オブジェクトをコンパイルして実行ファイルabcdを作成するに違いないと思うのです

-oオプションは出力ファイルを指定するものです。ただし、「実行ファイル」とは限りません。
どんなファイルになるかは、OPTIONSによります。
この場合は、 入力が$(objects)で、おそらくオブジェクトファイルなので、それをリンクして実行ファイルにするためのルールであろう、と予想できます。


> %.o: %.f
> $(FC) $(OPTIONS) -c -o $@ $<

これは型ルールです。~.fから~.oを作る際のコマンドを指定しています。
$@ $< は自動で設定される変数です。
$< を「$(FC) $(OPTIONS) -c 」でコンパイルして -oで $@ へ出力する
というコマンドです。
http://www.ecoop.net/coop/translated/GNUMake3.77 …

同じ -o で出力を指定していても、それぞれ目的が違います。


> 今回nmakeに拘っているのは、gnu系のソフトの利用に際して"そうして下さい”と言われているからなのです

これって、もしかして
「WIndowsでIntelFortranやVIsual C++等を使ってコンパイルするときは、nmake用のmakefile.mk が用意してあるので、それを使ってくれ」
ということでは?
MinGWで(コンパイラコレクションとしての)GCCで、という場合は、MinGWのbashから (./configure→) GNU Makeという方法が普通だと思われます。
ドキュメントをよく読んでください。
    • good
    • 0

GNU make は恐ろしく拡張されているので, 従来の make とは別物と思った方がいいです. それに対し nmake はほぼ「ふつ~の make」だったような気がするので, 「ふつ~の make」に関する資料はだいたい nmake でも使えるはず (ただし #1 に書かれているように暗黙のルールとかで一部違うところがあるので, それはあらかじめ確認しておくこと).



で, と.

#1 へのお礼の最後の方は何を言っているのかわかりません.

まず「最近はMinGW以外にもDOSプロンプトでunixコマンドを受け付けるので、使えるのではないかと思うのですが」というところですが, そのあと自ら書かれているように「ある人のPCでは実際に動作しているということがあっても他の人のPC環境では動作しないこともあるように思う」のであればこそ, 「標準的な DOS/Windows のコマンド」だけで書くべきだとは思いませんか?

あと, 次の点はさっぱりわかりません:
・「gnu系のソフトの利用に際して"そうして下さい”と言われている」ということですが, 「そう」とは「どう」だ, と? また, そもそも「gnu系」ってなんですか?
・「ダウンロードして調べたらチョコチョコミスもあるのです」については全く情報がないので何を言っているのかさっぱり. これでは 「何をダウンロードして『調べた』」のかわからんし, 「ミス」なのか「あなたの誤解」なのかも判断できないでしょ?
    • good
    • 0

> wave.fというファイルを探しだしてコンパイルしてwave.oを生成する



「gfortran -Wall wave.o -o wave」自体には、「wave.fを探してコンパイルする」などという機能はありません。
wave.oが必要だと判断し、その元となるwave.fを探すのは、makeの仕事です。

GNUMakeなら、wave.oの元になる候補を wave.c wave.cpp 等の候補から探して、 wave.f を見つけ、
.fから,oへの暗黙のルールを適用して、コンパイルしてくれるでしょう。

しかし、nmakeでは .o から .f を探すようなことはしないでしょう。
.oはUNIX系OSでオブジェクトファイルに使用する拡張子です。
Windowsではオブジェクトファイルには .OBJ が使われています。
ソースを探す機能はnmakeにもありますが、その対象はWindowsを基準にしたものです。OBJからFORは探しますが、.oから.fは探しません。
http://msdn.microsoft.com/ja-jp/library/cc367991 …


wave.o: wave.f
と明示的にルールを書くか
http://support.microsoft.com/kb/81454/ja
のようにfから.oへのルールを書くかしましょう。


> rm *.o    ← 削除

windowsでrmですか?
MinGW等を使っていて、(cl等の)Visual Studio系のコマンドを使っていないのなら、nmakeではなくGNUMakeの方がいいかもしれません
    • good
    • 0
この回答へのお礼

回答有難うございました。今回はnmakeを利用したいと思っています。根本的な質問になるのですが、そもそもmakeって何?ということがあります。私の理解は小分けして保存されているソースプログラムを集めてコンパイルして実行ファイルを作成することを支援するスクリプトファイル(makefile)の実行システムということなのですが。(本を読んだこともあるのですがいまいちピンときません)

makefileにはコンパイルのコマンド、コンパイルオプション、フォルダ指定、細々としたファイル名指定、コンパイル手順が記載されており、実際にコンパイルもするということだと思います。
$(FC) $(OPTIONS) -o abcd $(objects) ←このような記述がありますが、オブジェクトをコンパイルして実行ファイルabcdを作成するに違いないと思うのですが、同じようなことがmakefileのうちの2個所に見られたりします。

SPYSICS_SWE_1D: $(objects)
 $(FC) $(OPTIONS) -O SPYSSICS_SWE_1D $(objects)
というところと、

%.o: %.f
$(FC) $(OPTIONS) -c -o $@ $<
というところがあり、概ねどういうことを言っているのでしょうか。

このmakefileの中身ですが、ご指摘の通りrmなどと書くとunixかと思うのですが、最近はMinGW以外にもDOSプロンプトでunixコマンドを受け付けるので、使えるのではないかと思うのですが。

makeの動作に限らずこのような設定は個人のPCの環境に依存する場合がある(Linux風コマンドなど)ようで、ある人のPCでは実際に動作しているということがあっても他の人のPC環境では動作しないこともあるように思うのです。今回nmakeに拘っているのは、gnu系のソフトの利用に際して"そうして下さい”と言われているからなのですが、どこまで信頼したらいいのかなとも思っています。ダウンロードして調べたらチョコチョコミスもあるのです。

お礼日時:2013/11/10 23:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!