標題のように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件)
- 最新から表示
- 回答順に表示
No.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という方法が普通だと思われます。
ドキュメントをよく読んでください。
No.2
- 回答日時:
GNU make は恐ろしく拡張されているので, 従来の make とは別物と思った方がいいです. それに対し nmake はほぼ「ふつ~の make」だったような気がするので, 「ふつ~の make」に関する資料はだいたい nmake でも使えるはず (ただし #1 に書かれているように暗黙のルールとかで一部違うところがあるので, それはあらかじめ確認しておくこと).
で, と.
#1 へのお礼の最後の方は何を言っているのかわかりません.
まず「最近はMinGW以外にもDOSプロンプトでunixコマンドを受け付けるので、使えるのではないかと思うのですが」というところですが, そのあと自ら書かれているように「ある人のPCでは実際に動作しているということがあっても他の人のPC環境では動作しないこともあるように思う」のであればこそ, 「標準的な DOS/Windows のコマンド」だけで書くべきだとは思いませんか?
あと, 次の点はさっぱりわかりません:
・「gnu系のソフトの利用に際して"そうして下さい”と言われている」ということですが, 「そう」とは「どう」だ, と? また, そもそも「gnu系」ってなんですか?
・「ダウンロードして調べたらチョコチョコミスもあるのです」については全く情報がないので何を言っているのかさっぱり. これでは 「何をダウンロードして『調べた』」のかわからんし, 「ミス」なのか「あなたの誤解」なのかも判断できないでしょ?
No.1
- 回答日時:
> 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の方がいいかもしれません
回答有難うございました。今回は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系のソフトの利用に際して"そうして下さい”と言われているからなのですが、どこまで信頼したらいいのかなとも思っています。ダウンロードして調べたらチョコチョコミスもあるのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- クレジットカード クレジットカードが不正利用されたおそれがあり、番号が漏れている可能性があったので、有効期限はまだまだ 2 2022/07/16 13:51
- ラジオ 北海道のFM NORTHWAVEってなぜ曲をフルコーラスでかけることが殆どなんでしょうか?? またJ 1 2022/11/27 14:31
- 物理学 交流電圧の時間変化が正弦波の時の実効値の求め方についてですが、なぜ写真のような考え方で実効値が求まる 5 2023/08/17 20:51
- 株式市場・株価 【配当利回りランキングが各サイトで上位の順番が違うのはなぜですか?】 https://s.minka 3 2022/06/26 09:04
- その他(IT・Webサービス) ok waveとかいう終わってる過疎サイトの7000万って何? 1 2022/06/03 20:31
- システム科学 P波 S波 3 2022/04/04 22:35
- C言語・C++・C# Cのコンパイルでコメントアウトをそのままオブジェクトに保持したい 7 2023/08/01 22:22
- 教えて!goo 質問サイト 4 2022/11/21 13:32
- 邦楽 タイトルには無くて歌詞のみに ”波”(なみ)の漢字が出て来る曲と言えば何がありますか? 21 2022/06/18 18:52
- 哲学 哲学カテを振り返るに 6 2023/07/29 10:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
マクロ コンパイルがグレーバック
-
C言語でヘッダファイルにグロー...
-
C言語でmからnまでの合計を求め...
-
[c++] <pthread.h>がinclude で...
-
エクセルVBAではRound...
-
ProCでコンパイルエラーが出ます
-
コンパイルエラー:ユーザ定義...
-
ILSpyで、デコンパイルできない。
-
1 つ以上の複数回定義されてい...
-
関数形式マクロ
-
C++コンパイル時に『 C1083: in...
-
「fatal error C1189」を回避す...
-
RPGでプログラムからソースファ...
-
エラーメッセージの読み方につ...
-
「猫でもわかるプログラミング...
-
VB6で開発中…標準モジュール間...
-
複素数<complex.h>のErrorに関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
1 つ以上の複数回定義されてい...
-
ILSpyで、デコンパイルできない。
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
C++コンパイル時に『 C1083: in...
-
外部シンボル "_main"は未解決です
-
PRO*C コンパイルエラー
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
ビルドとリビルドの違いを教え...
-
RPGでプログラムからソースファ...
-
戻り値について
-
C++のhppファイルをCでinclude
おすすめ情報