- 締切済み
フォートランでコンパイルできません。
コンピュータ初心者ですが、ウィンドウズ上で、フォートランと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 が何をやっていてなぜ必要な操作なのかよくわかっていない初心者です。このような場合にどうやって解決したらいいのかわからないので、ここで質問致しました。何卒よろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- echoes_x86
- ベストアンサー率65% (21/32)
お力になれず申し訳ありません. cygwinのインストール自体がうまくいっていないような感触ですね. LAPACKやATLASを使わないでWRITEだけ使って画面出力を行うプログラムを書いてみてはどうですか? これで動かなければ,もはやcygwinが正しく設定できていないという他ありません. cygwinが正しく設定されていれば「cyggfortran-3.dllが見つからない」ということはあり得ないからです. さて,問題解決の一般論ですが,単純な検証作業に分解して一つ一つ解決していった方が良いでしょう. 最初から対角化のプログラムだけで作業していては,どこが悪いのかを一切判断できません. Linuxで動くからといって他でも動くかは分からないのですから. 最終目標が対角化にあって深い知識に興味がないと割りきるのは全く正しいですが,それで現状の要請が達成できないのでは本末転倒です. 検証で得られた結果が (a) write文だけのプログラムが動いて画面出力がされる (b) 対角化のプログラムは動作していないようだ となれば,(b)にあって(a)にない要素(例えばFILE I/O)を調査対象としてという具合いに作業したほうが良いと思います. また,何度か使っておられる「うまくいかない」という表現ですが,あまりお奨めできません. 我々回答者はあなたの「うまくいく」というのが如何なる動作なのかさっぱり分からないからです. 質問は「●●●という動作が期待されるが,結果は○○○である」とした方が有効な回答がつきやすいのではないでしょうか? 頑張ってください.
- echoes_x86
- ベストアンサー率65% (21/32)
結構大変そうですね. 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によってインストールされるものですが,何らかの理由によりこの部品を探す場所のリストにこのファイルの場所が登録されていなかったのでは? この登録処理は俗に「パスを通す」と言います. ちなみに電通大のページはかなり詳しい方が書かれたものと見え,極めて難解です. 詳細な考察は素晴らしいの一言につきるのですが…
補足
ありがとうございます。たしかに./aで何事もなく通るのですが、画面上に出力するようにwrite(*,*) を入れていますので、何も画面上にあらわれてこないというのは、うまくいっていないという事ではないかと思うのです。おそらく時間がたっても出力されるはずの何とか.datというファイルは出てこないものと思われます。これについてはどう考えたらよろしいでしょうか。よろしくお願い致します。
- echoes_x86
- ベストアンサー率65% (21/32)
ざっと見ると,コンパイラを混ぜて使っているのが気になります. 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 ファイル名 とすべきです.
補足
ありがとうございます。おっしゃっている事の要点はわかるつもりですが、そこからどうしたら良いかよくわからない自分が情けないです。 つまりgccの3系から4系に変えるという事ですね。どれが入っているかはおそらくインストール時にわかっていないといけないのですね。インストールに一日くらいかかってしまったので、そこまでさかのぼるよりは、もっと簡単に判別できる方法はありますでしょうか。 後半ですが、おそらくLAPACK自体はインストールできたと思うのですが、liblapack.aをliblapack_atlas.aと名前を変え、f77、、、のかわりにgfortran、、、 でコンパイルするべき、という事でしょうか。その通りやってみたら、コンパイルは通ったようですが、./a.outとしてもNo such file or directroyと言われます。 aという名前のファイルは出てくるのですが、それが実行されないようなのです。 プログラミングを実行さえできれば、深い知識は必要ないのですが、これを機に勉強した方がいいのかもしれません。
- osenbeyaketa
- ベストアンサー率75% (15/20)
補足
ありがとうございます。少し読んでみますと、閲覧者の条件が書いてあり、私はその条件を満たしていないようです。つまりそれを読むにもまだ準備がいるようです。その条件とは、 •独立にコンパイルしたオブジェクトをリンクできる •オブジェクトに含まれるシンボル名や依存関係を調査/解決できる •Cygwin と MinGW の出力するバイナリの違いを理解している •呼び出し規約の意味を理解している •UNIX シェルの一般知識を有し,ソフトウェアをソースコードからインストールできる また、最悪の場合でも以下の2つが必要との事です。 •書いてある内容を精確に遂行する能力 •Visual C++ で DLL を自力でリンクする能力 どうやったら上の条件を満たせるようになれるかがよくわかりません。UNIXの入門書から読むのが良いでしょうか。コンピューターに詳しい人がどのような本によって勉強してきたのかがよくわかりません。おすすめの本などありますでしょうか。
- Tacosan
- ベストアンサー率23% (3656/15482)
Cygwin で作ったのなら, 「実行ファイルの名前」は Windows に従って「なんちゃら.exe」になります. でそれを実行するのはやっぱり Cygwin から実行する方が安全でしょう. 必要なライブラリの位置を Windows が知っていればいいけど, そうじゃない (つまり Windows の実行パスに入っていない) と「そんなライブラリ知らん」って言われるような気がする. 「./a.exeにしないといけないのかなと思ってそうしてみると、何もおこりません。」については, これだけの情報で何かがわかると思う方がおかしい. そもそも「何をするプログラムなのか」「入出力はどうしているのか」が一切情報として出てきてないでしょ?
補足
ご回答ありがとうございます。 コンパイルは問題なく通るようになったので、「そんなライブラリ知らん」とはもう言われていないように思うのですが、どうなのでしょうか。 「「./a.exeにしないといけないのかなと思ってそうしてみると、何もおこりません。」については, これだけの情報で何かがわかると思う方がおかしい.」 との事ですが、それがわからないから初心者なんだと思います。逆に、ありがちなパターンではないのだなという事はよくわかりました。linuxでやる時は、単にf77 ファイル名 -llapack -lblas としてコンパイルが通ったら、./a.out とするだけで実行されましたので、コンパイルをしたディレクトリと同じ所で./a.outとするだけで良かったのですが、今回はwindowsだからといって、何の変更点があったのか、それに対してどうすれば良いのかがわからない状態です。何をするプログラムかですが、行列の対角化です。入出力はどうしているかですが、質問の意図が初心者なためよくわからないのですが、入力はフォートランのファイルがあるフォルダまでcdで移動し、そこでコンパイルします、出力は*.datで出力します(linuxでは問題なくできました、つまりプログラミング上の問題ではないと思います)。これで答えた事になっているのかはわかりません。何がわかっていないのかがわからない状態です。お手数かと思いますが、何かわかる事がありましたらお教え下さい。よろしくお願い致します。
- Tacosan
- ベストアンサー率23% (3656/15482)
ありがちパターンは ライブラリの指定はあとの方に書く ってやつだけどね.
補足
どうやらそのありがちパターンだったのか、コンパイルは通りました。ありがとうございます。ただ、その後、./a.outとすると、 「bash: ./a.out: No such file or directory」 となります。そのフォルダを見てみると、a.exeというのができているので、./a.exeにしないといけないのかなと思ってそうしてみると、何もおこりません。そのファイルを単純にクリックしてみると、 「プロシージャ エントリ ポイント cexpがダイナミック リンク ライブラリ cyggfortran-3.dll から見つかりませんでした。」 と出てきます。コンパイルが通ったように思えるのに実行できないのはどういう事なのでしょうか。実行のやり方が今の場合違うのでしょうか。よろしくお願い致します。
補足
参考になります。深い知識に興味がないと言っているわけではなく、今とりあえず短期的な結果が求められているので、そこまで技術的な部分を勉強する時間的余裕がないかもしれない、という事です。もちろんゆくゆくは勉強したいと思っています。 確かにwrite文だけのプログラムでは正しく画面出力されましたので、対角化の部分に問題があるのだと思います。 うまくいかないという表現は盲点でした。プログラムが命令どおりに動くのが、うまくいく事だと思っておりましたので。今回の場合ですと、write文に従って画面上に次々と数値が表示され、それが終わるとともにdatファイルがフォルダ上に出力されるという結果が期待されるが、結果何もおこらなかったとすべきでした。これからはこのような書き方をしようと思います。 これだけプログラミングに詳しい方々に伺ってもわからなかったのですから、私の知識の少なさが致命的なように思えます。解決策はもう誰かに伺うという事は期待していないので、このままechoes_x86様をベストアンサーにさせていただいて、この質問を閉じようかとも思いましたが、それでも自分で解決して、その結果を残したいので、まだこの質問はそのままにしておきます。ありがとうございました。