• ベストアンサー

awkについて

vine4.1でg77を使用しています. いままで,ひとつのファイルで g77 -o aaa a.f(サブルーチン含む)などとしていたのですが,サブルーチンが別のファイルにあるとき,どのようなコマンドで実行すればよいでしょうか? 例えば,main.f(メインプログラム),sub.f(サブルーチン)の場合のコンパイルはどのようにすればよいでしょうか?

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

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

Makefileに書くならこんな感じで。 prog: main.o sub.o <TAB>f77 -o prog main.o sub.o main.o: main.f <TAB>f77 -c main.f sub.o: sub.f <TAB>f77 -c sub.f 組込みのマクロを使うといろいろ工夫できますが、 わかりやすいところで愚直に書いてみました。 行頭にタブを置いても消えるので<TAB>としています。

19670226
質問者

お礼

どうもありがとうございました。助かりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

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

なぜにタイトルが「awkについて」なんでしょうか? Fortranプログラムのコンパイルに関しては Usage: g77 [options] file... とあるとおり複数のファイルをコンパイラドライバが受け付けるので、 g77 -o aaa main.f sub.f のようにすればよろしいかと。 個々のソースファイルを -c オプションつきで オブジェクトファイルまでの変換にしておいて あとでまとめてリンクでもいいですけど #Mafileに書くならこちら

19670226
質問者

補足

>なぜにタイトルが「awkについて」なんでしょうか? すみません。単なる間違いです。 どうもありがとうございます。 Makefileで書くとどうなるのですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • gfortranによるサブルーチンの実行

    初めて投稿させていただきます。 MacOS X 10.5上でgfortranを使用しているのですが、サブルーチンが実行できなくて困っています。メインプログラム(main.f90)とサブルーチン(fast.f90)を同一フォルダ内に置き、ターミナル上でコマンド $ gfortran main.f90 によってコンパイルを実行したところ、 Undefined symbols: "_fast_", referenced from: _MAIN__ in ccz2x6RV.o _MAIN__ in ccz2x6RV.o ld: symbol(s) not found というメッセージが出てコンパイルが失敗してしまいます。サブルーチンが認識されていないということは分かるのですが、それ以上のことはさっぱり分かりません。ご助力願います。 なお、プログラムの内容は高速フーリエ変換です。また、サブルーチンを用いないプログラムに関しては既に正常に動作することを確認しています。

  • C++からfortran77を呼び出す

    はじめまして。質問させて下さい。 私はfortran77で書かれたパッケージで使用されてる関数を、C++から呼び出して使えるコードを書いています。 けど、コンパイルがうまく通りません。 f77 -c -o main.o main.f f77 -c -o sub.o sub.f g++ -c Jikkou.cxx g++ main.o sub.o Jikkou.o -lg2c するとここで、以下のようなエラーを吐いちゃいます。 main.o: In function `main_': main.f:(.text+0x12c): undefined reference to `ran_' main.fとsub.fは、fortran77で書かれてるmainプログラムとサブルーチンです。 main.fの中で、乱数を出す為にRAN()を使ってるんですが、g++はこの関数が分からないようです。 どうにかg++にRAN()を分からせるいい方法はありませんか?

  • fortran 外部サブルーチンの読み込みについて

    c c main.f c dimension x(2) x(1)=1 x(2)=2 y=5 call sub(x,y,z) write(*,*)'x1=',x(1) write(*,*)'x2=',x(2) write(*,*)'y=',y write(*,*)'z=x1+x2+y=',z stop end c---------------------------------- c sub.f c subroutine sub(a,b,c) dimension a(2) c=a(1)+a(2)+b write(*,*)'b=',b return end  以上のようなプログラムをmain.fとsub.fに分離して、別々にコンパイル。最後にそれぞれの実行ファイルをつなげるといったことがしたいのですが、どのようにすればいいのでしょうか。 サブルーチンをメインプログラムが参照するといったことがしたいです。

  • FORTRANとC++の連動について

    私は,Fortranを用いて解析の業務をしている,プログラム初心者です。 購入したのは,Intel Visual Fortran8.0(VF)ですが,Windows環境でコンパイルリンクするには,Microsoft Visual C++ .NET 2003(VC++)が必要ということで,こちらも購入しました。 普段は,Fortranのコンソールで ifort **.f といったコマンドでコンパイルリンクし,実行しているだけです。 これからは,VC++の方に移行していきたいと考えていますが,しばらくはFortranで作成したサブルーチンを有効活用したと考えています。 そこで,VC++ベースのメインプログラムからFortranのサブルーチンを呼び出すプログラムの作成方法,コンパイルリンク方法をご教授ください。よろしくお願いします。 (1)ソースにどう記述するか? void CMyDlg::OnBnClickedOk() { ここで,FORTRANのサブルーチンを呼び出したい。     Fortranなら call subroutine( a, b ) } (2)コンパイルするときは, Visual Studio開発環境で,コンパイル→実行で良いのか? それとも,あらかじめVC++とVFで.objファイルを作成する必要があるのか?

  • awkで、キーボードからファイルを指定するには

    私は、awkプログラムを始めたばかりの初心者です。 データファイルがfile1、file2、file3とあって、どのファイルを実行させたいかをキーボードから入力させるには、どのようにすればよいのでしょうか。 次のようなプログラムを作ったのですが、うまくいきません。 { printf "ファイル名?" > "/dev/stderr"#画面表示 getline < "/dev/stdin" #数字入力 aaa = $0 #aaaに代入 } { getline < ("file"aaa".txt") #ファイル入力 print $0 #レコードを出力 } これを、バッジファイルで次のように実行をかけて、「結果.txt」に出力する。 jgawk -f prog.awk con > 結果.txt すると、コマンド画面が消えず、エラーとなってしまいます。 バッジファイルに問題があるのでしょうか。 「-f」の後には、プログラム名、データ名>出力ファイル名 とやるようですが、この場合、データ名が決まっていないわけで、キーボード入力したいのだから、「con」でいいのでしょうか。 プログラムを実行させるのに、ほかに良い方法があるのでしょうか。

  • モジュールとなったライブラリ集の利用法

    以下、長文ですみません。 サブルーチンとか関数に関するプログラム集というものがあり、自分でメインを適当に作ってそれらを呼び出して使うというライブラリ集のようなものがあります。昔からあるもので各言語に応じた本なども多数出版されています。 Fortranなのですが、F77の頃は以下のパターンが1つのファイルで延々と1万行ぐらい続くものです。ファイル名:A.f ---------------- 以下の形式のサブルーチン群の羅列 subroutine abc() いろいろ return end ---------------- このようなものは、例えば、 gfortran -c A.f としてリンクなしでコンパイルし、オブジェクトA.oが出力され、 メインプログラム(B.f)から呼び出す場合、 gfortran B.f -o A.o とすると、実行形式が出力されます(ここまで前置きが長くてすみません)。 さて、Fortran95だと状況が一変します。 A.f95だと以下のように変更されています(A.fの後継としてのA.f95)。 ------------- module A interface.... public... private... そしてサブルーチン群 subroutine abc() いろいろ return end subroutine abc end module A ------------ これを gfortran -c A.f95 とリンクなしでコンパイルすると、A.mod, A.oという2つのファイルが出力されます。 その後、メイン(B.f95)の作成ですが、モジュールA.modを読み込むため、 USE A を先頭にし,中身をF95のフォーマットにしています。その後、 gfortran B.f95 -o A.o あるいは gfortran B.f95 とするのですが、B.f95からcallしているA.f95の中のサブルーチンが発見できないというエラーになります。これら(A.f95, B.f95, A.o, A.mod)はすべて同一フォルダ内部のファイルです。 ここで万事休すなのですが、何かFortran95の処理で間違っているところがあるでしょうか。私がFortran95の処方を間違っているからではないかと思いますが、対処方法についてもしご存じでしたら、よろしくお願いします。 ※カテゴリ違いかもですが、ここしか聞く当てがないと思っています。

  • バッチファイルで実行がうまくできない(java)

    バッチファイルを作成してダブルクリックでコンパイル、実行できるようにしたいのですが、うまくいきません。 midiを演奏するプログラムをバッチファイルをダブルクリックして実行しようとすると Exception in thread "main" java.lang.NoSuchMethodError: main と出てしまいます。 コマンドプロンプトで set classpath=%classpath%;. と最初に入力していますし、別のソースをバッチファイルをダブルクリックすることによって実行することはできていますので、なにが原因かわかりません。 考えられる原因と、どうすればバッチファイルをダブルクリックすることによってコンパイル、実行できるかを教えてください。 お願いします。

  • 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 *** 最初のターゲットより前にコマンドを起動. 中止.」 です。

  • 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

  • awk と gawk の書き方の違い

    PCでAWKコマンドを使いたくてgawkを使ってみたのですが、 やっぱりawkのような書き方では上手く実行できないみたいです。 gawkのバージョンは v3.1.6です。 コマンド (awk) awk -F, '{printf("copy aaa\%s bbb\%sn",$0,$0)}' list.txt 単純にDOSのバッチをファイルから作りたいだけなのですが・・・gawkではどのように書けば良いのか教えてください。お願いします。 仕事でUNIXを使っていたのですがPCに移行するという話がでていて、今までのunixコマンドをPCで動くようにソースを書き直して行かなくてはならないのにパスを『/』から『\』にしただけでは全く動きませんでした。やっぱりUNIXのawkでは出来てPCのgawkでは出来ないこともあるのでしょうか?それとも書き方の問題でしょうか??