• ベストアンサー

gfortranでmakefile

gfortranのmakefileを作成し、"make test"と実行しても成功しません。 どうすればいいのでしょうか? どこか間違いがあるでしょうか? 下にmakefileを全文載せましたのでアドバイスをよろしくお願いします。 OBJS = main.o tree.o treef.o test : ${OBJS} gfortran -c test ${OBJS} main.fやtree.fやtreef.fのファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。 ちなみに、"make test"と実行して出てくるエラーメッセージが「makefile:3 *** 最初のターゲットより前にコマンドを起動. 中止.」 です。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

> commands commence before first target. Stop このエラーメッセージで検索すると "`commands commence before first target. Stop.'(訳:最初のターゲットの前にコマンドが開始されました。停止します。) `missing rule before commands. Stop.'(訳:コマンド前のルールの欠落。停止します。)  これはmakefileの最初がコマンドスクリプトの一部になっているようだという意味です。つまりタブ文字で始まっていて(変数式のような)makeで定められたコマンドが見当たらない、という事です。コマンドスクリプトはターゲットに常に関連していなければなりません。 生成される第二の要因は、セミコロンが空白ではない最初の文字として行にある場合で、makeはこれを行の"ターゲット: 依存関係"の項目を省いたと解釈します。" http://www.ecoop.net/coop/translated/GNUMake3.77/make_16.jp.html というのが見つかります。 本当に、うまくいくPCといかないPCとで同じmakefileですか? うまくいくのといかないのとそれぞれの環境で od -t x1 makefile としたら結果は同じですか? OSとかディストリというのは、 たとえば CentOS とか Vine Linuxとか、どういう名前のものを 使っているかという確認でした。 うまくいかないPCだけ別のもの使ってるとかはありませんか? わけわかんなければ uname -a ってコマンドをそれぞれのPCで実行して、その結果を比べてください。

その他の回答 (4)

  • ishi7474
  • ベストアンサー率32% (71/216)
回答No.4

UNIX系OSでは"test"という名前のコマンドがあるので、それと 混同している可能性もあります。"test"→"test1"とかに変更 して試されてはどうですか。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

すんません。寝ぼけてました。 カテゴリからすればほぼ間違いなく GNU make ですわな。 ということで、先の補足要求のOSはディストリに読み替えてくださいませ。

tak1234321
質問者

補足

すみません、具体的にどうすればいいのでしょうか? 素人なもので、専門用語とかよくわからないのですが・・・。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

OBJS = main.o tree.o treef.o test : ${OBJS} gfortran -c test ${OBJS} これ、gfortranのオプション間違ってません? gfortran -o test ${OBJS} ならわかるんですが。 とりあえずこれはgfortranじゃなくてmakeの問題でしょう。 うまくいくものと、いかないものの環境をそれぞれ書いてください。 とりあえずOSとmakeのバージョンかな。 使っているmakeが違っていて suffix ルールが違うとか。 あ、Unix系のOSを使っているのなら、 LANG=C make test でメッセージが変わります?

tak1234321
質問者

補足

現在使用しているパソコンが購入したばかりのものであり、うまくいった試しがまだありません・・・。 僕自身も素人でして、専門用語とかよくわからないのですが、具体的にどうすればいいのでしょう? ちなみに LANG=C make test とコマンド文を打てばいいのでしょうか? 打ったら「*** commands commence before first target. Stop」 と表示されます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

う~ん, 英語のメッセージじゃないとわからんなぁ.... ひょっとすると, どこかの行の先頭にこっそりタブ文字が入ってたりしませんか? ... と, 手元の本 (GNU Make) には書いてあった.

関連するQ&A

  • gfortranでmakefile

    gfortranのmakefileを作成し、"make test"と実行しても成功しません。 どうすればいいのでしょうか? どこか間違いがあるでしょうか? 下にmakefileを全文載せましたのでアドバイスをよろしくお願いします。 OBJS = main.o tree.o treef.o\ test : ${OBJS} gfortran -c test ${OBJS} main.fやtree.fやtreef.fのファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。

  • Makefileについて

    makeファイルの書き方で悩んでいます。 makeファイルは書いたことがなく、ほとんど丸写しです。 私がしたいのは、 (1)run:部分で削除するファイルがなかった場合、エラーとなり次の行へ進みません。なくても(エラーでも/エラー回避して)次の行へ進む方法が知りたいです。 もうひとつは(2)run:部分で、cleanを実行し、makeしてrunを実行させる方法が知りたいです。 --------------以下、サンプルMakefileです。 CC = gcc OBJS = main.o sub.o PROG = test.exe .c.o: $(CC) -c $< -o $@ $(PROG) : $(OBJS) $(CC) $(OBJS) -o $(PROG) $(OBJS) : Makefile clean: rm -f *.o $(PROG) run: rm *.log <---- (1)ここでファイルがないとエラーで止まる $(PROG) all:   <-- (2)[clean]を実行して、makeして、[run]を実行させたい 以上です。

  • C言語のmakefileについて

    C言語のmakefileについて質問です。 例えば下記makefileでは、“CC”というマクロを“gcc”という文字列で再定義しています。 しかし中には(1)『CC = gcc』という定義なしでいきなり(2)『$(CC) -o hello $(objs)』 でコンパイルしているmakefileを見るのですが、その場合(2)は何でコンパイルされているのでしょうか。($(CC)の中身はCC??GCC?ACC??) ※下記ターゲット名等はサンプルです。 ------------------ # Makefile objs = hello.o edajima.o CC = gcc hello: $(objs) $(CC) -o hello $(objs) .PHONY: clean clean: $(RM) hello $(objs)

  • makefileでコピーしてからコンパイルする方法

    諸事情あって、C言語のコンパイルするファイルを(vpathで指定せずに)カレントディレクトリにコピーしてから、コンパイルを実行したいと思っています。 以下のように、compile_pre でコピー、compile_main でgcc を起動しているのですが、main.oがコンパイルできない旨、エラーで終了してしまいます。 これはどうしてなのでしょうか? (compile_pre → comple_main の順番には実行しないのでしょうか?) また、このようなことをしたいばあい、何か良い方法はありませんでしょうか。 ----------------------------------------------- # (src/main.c から main.o を生成して、main.exe を生成する) TARGET = main.exe TARGET_OBJS = main.o #TARGET_OBJS += sub.o ... .PHONY: compile compile_pre compile_main compile: compile_pre compile_main compile_pre:      cp -fp ./src/main.c .; compile_main: $(TARGET) $(TARGET): $(TARGET_OBJS)      gcc -o $(TARGET) $(TARGET_OBJS) %.o : %.c      gcc -c -o $@ $< ----------------------------------------------- UNIX%> make compile --dry-run --debug GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i686-pc-linux-gnu Reading makefiles... Updating goal targets....  File `compile' does not exist.    File `compile_pre' does not exist.   Must remake target `compile_pre'. cp -fp ./src/main.c .;   Successfully remade target file `compile_pre'.    File `compile_main' does not exist.      File `main.exe' does not exist.        File `main.o' does not exist.       Must remake target `main.o'. make: *** No rule to make target `main.o', needed by `main.exe'. Stop. 宜しくお願い致します。

  • makefileの書き方

    makefileを書いたのですが、コンパイルしたあとに、main.cppの内容を変更してから、またmakeってタイプして変更した箇所が反映されません。どこがおかしいでしょうか?よろしくお願いします。 program : main.o g++ -o program main.o main.o : main.cpp g++ -Wall -c main.cpp DeleteObj: rm main.o

  • makefileを実行すると・・・

    タイトルの通り、makefileを実行したところ、次のようなエラーが出ました。 make: *** No targets. Stop. 考えられる理由としては、何がありますでしょうか? ちなみにmakefileを使わず普通に実行すると成功したので、makefile自体に問題があると思います。 使用しているのはMacのターミナルです。 次がmakefileの内容です。 #Makefile CC = gcc CFLAG = -03 MFLAG = -lm SRC = main.c open.c read_write.c OBJ = main.o open.o read_write.o all:dummy dummy:$(OBJ) $(CC)$(CFLAG) -o dummy $(OBJ) $(MFLAG) main.o: main.c $(CC)$(CFLAG) -c main.c open.o: open.c $(CC)$(CFLAG) -c open.c read_write.o: read_write.c $(CC)$(CFLAG) -c read_write.c clean: rm -f *.o

  • makefileが見つかりません。

    つい最近Cygwinを使ってC言語を始めたものです。 make app=ファイル名を実行したところ、 「make: ☆☆☆ターゲットが指定されておらず、makefileも見つかりません.中止」と出てしまいます。 原因はなんなのでしょうか? パソコン自体も初心者なので設定自体が正しく完了できていないかもしれません。 用語も全然わからないので初心者向けにアドバイスしていただけると助かりますm(_ _)m

  • makefile の書き方

    OBJS1 = a.o b.o c.o OBJS2 = d.o e.o f.o OBJS1のそれぞれの元のソースコードと OBJS2のそれぞれに元のソースコードを 違うコンパイルオプションでオブジェクトファイルを作りたいのですが、 間単に書ける方法があれば教えてください。 つまり、以下を簡単に書く方法です。 よろしくお願いします。 a.o: a.c ${CC} ${CFLAGS_1} $< -o $@ b.o: b.c ${CC} ${CFLAGS_1} $< -o $@ c.o: c.c ${CC} ${CFLAGS_1} $< -o $@ d.o: d.c ${CC} ${CFLAGS_2} $< -o $@ e.o: e.c ${CC} ${CFLAGS_2} $< -o $@ f.o: f.c ${CC} ${CFLAGS_2} $< -o $@

  • Eclipse 3.5 Galileo + CDT + cygwinで

    Eclipse 3.5 Galileo + CDT + cygwinで、CやC++のプログラムを作りたいと考えています。 しかし、ビルドが通らず、困っています。 行った作業手順は、以下の通りです。 (1)まず、下記サイトを参考に、簡単なCプログラムを作りました。  http://www.c.csce.kyushu-u.ac.jp/~seiichirou/wiki/index.php?Makefile%A4%CE%BD%F1%A4%AD%CA%FD  ----以下、作成したプログラム----  /* hello.c */  #include <stdio.h>  void edajima(void);  int main(int argc, char* argv[]) {   edajima();   return 0;  }  /* edajima.c */  #include <stdio.h>  void edajima(void);  void edajima(void) {   printf("わしが男塾塾長 江田島平八である!!\r\n");  }  ----プログラムここまで---- (2)そして、Makefileを以下のように作成しました。  ----以下、Makefile----  # Makefile  CC = gcc  CXXFLAGS = -O2 -g -Wall -fmessage-length=0  OBJS = edajima.o hello.o  LIBS =  TARGET = hello.exe  $(TARGET): $(OBJS)   $(CC) -o $(TARGET) $(OBJS) $(LIBS)  all: $(TARGET)  hello.o: hello.c   $(CC) -c hello.c  edajima.o: edajima.c   $(CC) -c edajima.c  clean:   rm -f $(OBJS) $(TARGET)  ----Makefileここまで---- (3)次に、EclipseでCのMakefileプロジェクトの作成をしました。   ロケーションは、上記ソースやMakefileがあるディレクトリを指定しました。 (4)Eclipseのプロジェクトエクスプローラで、Makefileを右クリックし、[Makeターゲット]-[作成]   でMakeターゲットを作成しました。 (5)Makefileを右クリックし、[Makeターゲット]-[ビルド]を実行すると、下記エラーが出て、   ビルドに失敗しました。  make hello  gcc -c hello.c  gcc hello.o -o hello  hello.o:hello.c:(.text+0x17): undefined reference to `_edajima'  collect2: ld returned 1 exit status  make: *** [hello] Error 1 どうやら、edajima.cがコンパイルされていない様です。 cygwin上でmakeコマンドを実行すると、ビルドできるので、Makefileは間違っていないと思っているのですが・・・。 どなたか、分かる方、ご教授願います。

  • Makefileの書き方

    正しいかどうかわかりませんが、インターネットである程度検索してから以下のようなJavaのコンパイル用Makefileを作成しました。なお、全てのクラスのパッケージは package abc.def.ghi; です。 ---Makefile--- .SUFFIXES: .java .class JC = /usr/bin/javac PATH = ./abc/def/ghi/ CLASSPATH = -classpath /Users/macintosh/ TARGET1 = Prog1 TARGET2 = Prog2 TARGET3 = Prog3 list: $(PATH)$(TARGET1).class \ $(PATH)$(TARGET2).class \ $(PATH)$(TARGET3).class .java.class: $(JC) $(CLASSPATH) $< clean: /bin/rm -f $(PATH)*.class これで/Users/macintoshディレクトリからmakeを実行すると、 /usr/bin/javac -classpath /Users/macintosh/ abc/def/ghi/Prog1.java /usr/bin/javac -classpath /Users/macintosh/ abc/def/ghi/Prog2.java /usr/bin/javac -classpath /Users/macintosh/ abc/def/ghi/Prog3.java が実行され、無事にクラスファイルが3つ生成されます。-classpathによりクラスパスも同時に設定されるので、あとはどこのディレクトリからでも $java abc.def.ghi.Prog1 でプログラムが実行されると思ったのですが/Users/macintosh/以外のディレクトリから実行すると Exception in thread "main" java.lang.NoClassDefFoundError: というエラーになります。何がおかしいのでしょうか。あと、Java用のMakefileで改善したところがあれば教えて下さい。

    • ベストアンサー
    • Java