• 締切済み

フォートランでコンパイルできません。

コンピュータ初心者ですが、ウィンドウズ上で、フォートランとlapackを使おうと、cygwinをインストールし、さらに、ホームページ、 http://www.kkaneko.com/rinkou/cygwin/atlas.html にしたがってATLASというのもインストールしました(したつもりです)。 しかし、 f77 -llapack -lblas ファイル名 とすると、 undefined reference to `_zheevx_' collect2:ld returned 1 exit status (zheevxとは行列の対角化をするlapackのサブルーチン)となってしまい、コンパイルできません。 エラーメッセージなどは出てこず、 ls /usr/atlas/lib とすると、 libatlas.a libcblas.a libf77blas.a liblapack.a と出てくるので、正しくインストールできているように思えたのですが、どこに原因があってどうすればうまくコンパイルできるのでしょうか。上記のホームページ上の記述も、configure や make が何をやっていてなぜ必要な操作なのかよくわかっていない初心者です。このような場合にどうやって解決したらいいのかわからないので、ここで質問致しました。何卒よろしくお願い致します。

みんなの回答

回答No.6

お力になれず申し訳ありません. cygwinのインストール自体がうまくいっていないような感触ですね. LAPACKやATLASを使わないでWRITEだけ使って画面出力を行うプログラムを書いてみてはどうですか? これで動かなければ,もはやcygwinが正しく設定できていないという他ありません. cygwinが正しく設定されていれば「cyggfortran-3.dllが見つからない」ということはあり得ないからです. さて,問題解決の一般論ですが,単純な検証作業に分解して一つ一つ解決していった方が良いでしょう. 最初から対角化のプログラムだけで作業していては,どこが悪いのかを一切判断できません. Linuxで動くからといって他でも動くかは分からないのですから. 最終目標が対角化にあって深い知識に興味がないと割りきるのは全く正しいですが,それで現状の要請が達成できないのでは本末転倒です. 検証で得られた結果が (a) write文だけのプログラムが動いて画面出力がされる (b) 対角化のプログラムは動作していないようだ となれば,(b)にあって(a)にない要素(例えばFILE I/O)を調査対象としてという具合いに作業したほうが良いと思います. また,何度か使っておられる「うまくいかない」という表現ですが,あまりお奨めできません. 我々回答者はあなたの「うまくいく」というのが如何なる動作なのかさっぱり分からないからです. 質問は「●●●という動作が期待されるが,結果は○○○である」とした方が有効な回答がつきやすいのではないでしょうか? 頑張ってください.

computerlayman
質問者

補足

参考になります。深い知識に興味がないと言っているわけではなく、今とりあえず短期的な結果が求められているので、そこまで技術的な部分を勉強する時間的余裕がないかもしれない、という事です。もちろんゆくゆくは勉強したいと思っています。 確かにwrite文だけのプログラムでは正しく画面出力されましたので、対角化の部分に問題があるのだと思います。 うまくいかないという表現は盲点でした。プログラムが命令どおりに動くのが、うまくいく事だと思っておりましたので。今回の場合ですと、write文に従って画面上に次々と数値が表示され、それが終わるとともにdatファイルがフォルダ上に出力されるという結果が期待されるが、結果何もおこらなかったとすべきでした。これからはこのような書き方をしようと思います。 これだけプログラミングに詳しい方々に伺ってもわからなかったのですから、私の知識の少なさが致命的なように思えます。解決策はもう誰かに伺うという事は期待していないので、このままechoes_x86様をベストアンサーにさせていただいて、この質問を閉じようかとも思いましたが、それでも自分で解決して、その結果を残したいので、まだこの質問はそのままにしておきます。ありがとうございました。

回答No.5

結構大変そうですね. gccのバージョンはcygwinのコマンドプロンプトで gcc -v とやれば調べられます. ただし,gccの3系と4系を両方インストールすると,それぞれが同時に使えるように3系はgcc,4系はgcc-4というコマンド名でインストールされたように思います. さて,cygwinでのパッケージ名はgcc4-fortranというようですが,gfortranを実行できて実行ファイルa.exeができているのであればインストールは済んでいるのだと思います. あとはcygwinのコマンドプロンプトから ./a または ./a.exe とやってみてください. エクスプローラからa.exeをダブルクリックして実行できなかったのは「ランタイム」という,プログラムの部品が見つからなかったのだと思います. cyggfortran-3.dllはgcc4-fortranによってインストールされるものですが,何らかの理由によりこの部品を探す場所のリストにこのファイルの場所が登録されていなかったのでは? この登録処理は俗に「パスを通す」と言います. ちなみに電通大のページはかなり詳しい方が書かれたものと見え,極めて難解です. 詳細な考察は素晴らしいの一言につきるのですが…

computerlayman
質問者

補足

ありがとうございます。たしかに./aで何事もなく通るのですが、画面上に出力するようにwrite(*,*) を入れていますので、何も画面上にあらわれてこないというのは、うまくいっていないという事ではないかと思うのです。おそらく時間がたっても出力されるはずの何とか.datというファイルは出てこないものと思われます。これについてはどう考えたらよろしいでしょうか。よろしくお願い致します。

回答No.4

ざっと見ると,コンパイラを混ぜて使っているのが気になります. cyggfortran-3.dllはgccの4系で利用されるFortranランタイムです. おそらくはBLASまたはLAPACKの依存関係でロードが試みられているのでしょう. ですが,あなたが実行ファイルのコンパイルに利用しているのはf77で,これはgccの3系のFortranコンパイラです. 無用の混乱を招かぬようにgccの4系で統一したらどうですか? gcc 4系のFortranコンパイラはgfortranとかgfortran-4といったものです. それから > f77 -llapack -lblas ファイル名 ではATLASのライブラリをリンクすることはできません. まず,cygwinのパッケージとしてLAPACKをインストールし,ATLASのliblapack.aのファイル名をliblapack_atlas.aとでも変えた上で gfortran -L/usr/atlas/lib -llapack -lf77blas -lcblas -latlas ファイル名 とすべきです.

computerlayman
質問者

補足

ありがとうございます。おっしゃっている事の要点はわかるつもりですが、そこからどうしたら良いかよくわからない自分が情けないです。 つまりgccの3系から4系に変えるという事ですね。どれが入っているかはおそらくインストール時にわかっていないといけないのですね。インストールに一日くらいかかってしまったので、そこまでさかのぼるよりは、もっと簡単に判別できる方法はありますでしょうか。 後半ですが、おそらくLAPACK自体はインストールできたと思うのですが、liblapack.aをliblapack_atlas.aと名前を変え、f77、、、のかわりにgfortran、、、 でコンパイルするべき、という事でしょうか。その通りやってみたら、コンパイルは通ったようですが、./a.outとしてもNo such file or directroyと言われます。 aという名前のファイルは出てくるのですが、それが実行されないようなのです。 プログラミングを実行さえできれば、深い知識は必要ないのですが、これを機に勉強した方がいいのかもしれません。

回答No.3
参考URL:
http://www.mlab.ice.uec.ac.jp/~ej-sib/numerical/numerical_windows3.html
computerlayman
質問者

補足

ありがとうございます。少し読んでみますと、閲覧者の条件が書いてあり、私はその条件を満たしていないようです。つまりそれを読むにもまだ準備がいるようです。その条件とは、 •独立にコンパイルしたオブジェクトをリンクできる •オブジェクトに含まれるシンボル名や依存関係を調査/解決できる •Cygwin と MinGW の出力するバイナリの違いを理解している •呼び出し規約の意味を理解している •UNIX シェルの一般知識を有し,ソフトウェアをソースコードからインストールできる また、最悪の場合でも以下の2つが必要との事です。 •書いてある内容を精確に遂行する能力 •Visual C++ で DLL を自力でリンクする能力 どうやったら上の条件を満たせるようになれるかがよくわかりません。UNIXの入門書から読むのが良いでしょうか。コンピューターに詳しい人がどのような本によって勉強してきたのかがよくわかりません。おすすめの本などありますでしょうか。

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

Cygwin で作ったのなら, 「実行ファイルの名前」は Windows に従って「なんちゃら.exe」になります. でそれを実行するのはやっぱり Cygwin から実行する方が安全でしょう. 必要なライブラリの位置を Windows が知っていればいいけど, そうじゃない (つまり Windows の実行パスに入っていない) と「そんなライブラリ知らん」って言われるような気がする. 「./a.exeにしないといけないのかなと思ってそうしてみると、何もおこりません。」については, これだけの情報で何かがわかると思う方がおかしい. そもそも「何をするプログラムなのか」「入出力はどうしているのか」が一切情報として出てきてないでしょ?

computerlayman
質問者

補足

ご回答ありがとうございます。 コンパイルは問題なく通るようになったので、「そんなライブラリ知らん」とはもう言われていないように思うのですが、どうなのでしょうか。 「「./a.exeにしないといけないのかなと思ってそうしてみると、何もおこりません。」については, これだけの情報で何かがわかると思う方がおかしい.」 との事ですが、それがわからないから初心者なんだと思います。逆に、ありがちなパターンではないのだなという事はよくわかりました。linuxでやる時は、単にf77 ファイル名 -llapack -lblas としてコンパイルが通ったら、./a.out とするだけで実行されましたので、コンパイルをしたディレクトリと同じ所で./a.outとするだけで良かったのですが、今回はwindowsだからといって、何の変更点があったのか、それに対してどうすれば良いのかがわからない状態です。何をするプログラムかですが、行列の対角化です。入出力はどうしているかですが、質問の意図が初心者なためよくわからないのですが、入力はフォートランのファイルがあるフォルダまでcdで移動し、そこでコンパイルします、出力は*.datで出力します(linuxでは問題なくできました、つまりプログラミング上の問題ではないと思います)。これで答えた事になっているのかはわかりません。何がわかっていないのかがわからない状態です。お手数かと思いますが、何かわかる事がありましたらお教え下さい。よろしくお願い致します。

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

ありがちパターンは ライブラリの指定はあとの方に書く ってやつだけどね.

computerlayman
質問者

補足

どうやらそのありがちパターンだったのか、コンパイルは通りました。ありがとうございます。ただ、その後、./a.outとすると、 「bash: ./a.out: No such file or directory」 となります。そのフォルダを見てみると、a.exeというのができているので、./a.exeにしないといけないのかなと思ってそうしてみると、何もおこりません。そのファイルを単純にクリックしてみると、 「プロシージャ エントリ ポイント cexpがダイナミック リンク ライブラリ cyggfortran-3.dll から見つかりませんでした。」 と出てきます。コンパイルが通ったように思えるのに実行できないのはどういう事なのでしょうか。実行のやり方が今の場合違うのでしょうか。よろしくお願い致します。

関連するQ&A

  • cygwin gccでのコンパイル

    cygwinをインストールをallでインストールし、gccでコンパイルを行おうとしたところ /usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot find -luser32 collect2: ld returned 1 exit status と表示され、コンパイル出来ません。 なにが原因でしょうか。 以上、宜しくお願い致します。

  • crypt関数を含むプログラムソースのgccを用いたコンパイルについて(C言語)

    crypt関数を含むCのプログラムソースをgccを用いてコンパイルしようとしたところ、 /cygdrive/c/DOCUME~1/○○○/LOCALS~1/Temp/ccGF0SZX.o:trip.c:(.text+0x373): undefined reference to `_crypt' collect2: ld returned 1 exit status と出てコンパイルできませんでした。 最初はcygwinのインストールの時に何かが足りていなかったのだろうと思い、すべてインストールしなおしたのですがそれでもやはりだめでした。 http://www.ninnin.net/blog/archives/000508.html に、gccなら問題なく使えると書いてあったのですが2005年の記事なので今はもう使用できなくなってしまったのでしょうか? どうかご教授お願いします。

  • コンパイルについて

    プログラミング超初心者です。 今年からプログラミングの授業があるので家のパソコンでもプログラミングの出来る環境を作ってみました。 エディタソフトはVisual C++2008を使用することにしました。コンパイラソフトは学校と同じcygwinをインストールしてみました。 質問なんですがVisual C++2008でソースコードを入力し、それをcygwinでコンパイルすることは出来るのでしょうか? 理由はVisual C++2008でコンパイル出来ることは、わかってるのですが学校でcygwinを使用してるので慣れるために別々に使用したいからです。もし出来るのならばやり方を教えてもらえないでしょうか? ちなみに学校では、エディタソフトが秀丸を使用しコンパイラソフトはcygwinを使用してます。 もし他におすすめのソフトがあれば教えてもらうと助かります。よろしくお願いします。

  • C言語プログラムの質問なんですが、エラーが出てコンパイルできません。

    C言語プログラムの質問なんですが、エラーが出てコンパイルできません。 エラーメッセージ /tmp/ccGHoP41.o: In function `main': step1-7.c:(.text+0x39): undefined reference to `stringStdin' collect2: ld returned 1 exit status 何が間違ってるのか全くわからない状態です。 どなたかアドバイスお願いします!

  • g77でコンパイルできない

    cygwinをgcc関連のパッケージだけインストールし、パスも通したのですが、command prompt 上においてg77でコンパイルしようとしても、 'g77'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません とでてしまい、コンパイルできません。 パスを通したc:\cygwin\bin の中を見ると、g77.exeはあるのですが・・・ 初心者なので、アドバイスよろしくお願い致します

  • windowsでのcのコンパイルについて

    cygwinをc:直下にインストールしてc:直下にaフォルダをつくりそのフォルダの中にbat.cファイルを作り、c:\cygwin\cygwin.batダブルクリックして実行した場合c:\a\bat.cをコンパイルするにはどうすればいいのでしょうか。

  • CygwinにインストールされたGCCを2.95にしたい

    Cygwin上でATLASというソースをコンパイルしようとしたところ、なんどもエラーがでて、止まってしまいます。 調べたところ、GCCのバージョンを2.95にする、という対処法がありました。 ですが、そのインストール法について調べても、よくわかりません。 昔はcygwinのsetup中にgcc-2という項目があったようなのですが、いまでは見つかりませんので、cygwin上でgcc3.*をアンインストールして、2.*をインストールするしかないのでしょうか? また、そうだとすれば、どうやればいいのでしょうか? cygwin上でgcc2を使う方法をどうか教えてください。

  • cygwin環境

    C言語にて作成したプログラムをcygwin環境にて(gcc)コンパイルすると "c:\DOCUME~1\ユーザ名\LOCALS~1\Temp/ccy2baaa.o:sl.c:(.text+0x4f):undefined reference to __imp__(func名)@16 collect2:ld returned 1 exit status" のようなエラーが発生してしまいます。 解決法は無いでしょうか??

  • テキストどおりにうったところ・・・

    /cygnus/CYGWIN~1/H-I586~1/bin/../lib/gcc-lib/i586-cygwin32/2.95/../../../../i586 -cygwin32/lib/libcygwin.a(libcmain.o): In function `main': /home/noer/src/b20/comp-tools/devo/winsup/libcmain.cc:38: undefined reference to `WinMain@16' collect2: ld returned 1 exit status  こんな文字がでてきてしまって、手に負えません。 いったい、なにを訴えかけているのでしょうか? わかる方がいらっしゃったら教えてください。お願いします。

  • WindowsXPHome+MinGWでGLUTを使ったプログラムをコンパイルするには?

    http://www.rimath.saitama-u.ac.jp/lab.jp/tsakurai/opengl/index-old.htmlの > gnuwin32 (Cygwin, Mingw32, egcs) の場合: --- Obsolete !! を参考にしてlibglut32.aを作成し、MinGWフォルダの\libフォルダ内に配置しました。 また、 http://www.xmission.com/~nate/glut.html のglut-3.7.6-bin.zip (117 KB) をダウンロードして、 MinGWフォルダの\include\GLにglut.hを、system32フォルダにglut32.dllを それぞれ配置しました。 しかし必要なファイルは揃っているはずなのに http://kano.feena.jp/?OpenGL のインストール確認プログラムをMinGWのmakeでコンパイルしようとすると、 gcc -o testglut testglut.o -lglut32 -lglu32 -lopengl32 testglut.o:testglut.c:(.text+0x1c): undefined reference to `__glutInitWithExit@1 2' testglut.o:testglut.c:(.text+0x3c): undefined reference to `__glutCreateWindowWi thExit@8' testglut.o:testglut.c:(.text+0x5c): undefined reference to `__glutCreateMenuWith Exit@8' collect2: ld returned 1 exit status make: *** [testglut] Error 1 のようにエラーが出ます。 どのようにしたらよいでしょうか? GLUTを使っていないプログラムをコンパイルして問題箇所を特定しようと 思ったのですがそのようなプログラムWebにはなかったため GLUTの問題なのかそもそもOpenGLの問題なのかもよくわかりません。申し訳ありません。 どなたか教えてください。お願いします。

専門家に質問してみよう