0

以前、サポートされていないコンパイラと高価なライブラリを必要とする古いコードを、Windows 上の Eclipse で gfortran を使用するバージョンに更新する際に問題が発生しました。しばらく休ませてから、最近はまったく別のアプローチを取り、プログラムをゼロから再構築し、ubuntu マシンで開発しましたが、同僚が貢献できるように、Windows マシンに戻したいと考えています。 .

ステータス:

  • プログラムは、GCC GNU コンパイラを使用して ubuntu マシンでコンパイル、実行し、良好な結果をもたらします
  • Windows 7 マシン、64 ビット
  • lapack と liblapack-devel を使用した Cygwin のインストール (gnu fortran 用) (ただし、blas と lapack を手動でコンパイルするため、これらは使用しません)
  • (C:/cygwin/lib を Windows パスに追加)

元の問題:

プログラムは cygwin でコンパイルされます ( make-command を呼び出し、make コマンドを呼び出して、ここにある makefile を呼び出します: http://thijsvandenbrande.be/phd/hamfemInstall/makefile

これにより、ファイル hamfem.exe が返され、Windows でダブルクリックして実行すると、次のエラーが返されます。The program can't start because cyglapack-0.dll is missing from your computer. Try reinstalling the program to fix this problem.

cygwin から実行可能ファイルを実行する場合、./hamfem.exeコマンドを呼び出すと、実行可能ファイルの実行が開始されます。ただし、この実行可能ファイルを同僚に渡して、入力ファイル (実行可能ファイルへの相対パスを持つフォルダーにあります) を変更できるようにするためのソリューションが必要です。

以下のコメントをさらに進めて、次のことを試しました。

  1. Windowsパスにファイルへの正確なパスを追加し、C:\cygwin\lib\lapack\cyglapack-0.dll後で再起動しても役に立ちません。
  2. ライブラリを呼び出す前にメイクファイルに -static を追加すると、依存関係エラーが発生します。これは、他の多くのコマンド (DPBTRF と DPBTRS) に依存する lapack ライブラリの 2 つのコマンドを使用するためです。これらのコマンドは、mainprog.f90 モジュールで使用されます。エラー:/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../liblapack.a(dpbtrf.f.o): In function 'dpbtrf': /usr/src/debug/lapack-3.4.2-1/SRC/dpbtrf.f:277: undefined reference to 'dtrsm_' および依存関係を示すさらに数行。
  3. ファイルを src フォルダーに追加しliblapack.aますが、コンパイラーは常に cygwin の lapack に戻ります

lapack の Web サイトでは、通常、関数とその依存関係 ( DPBTRFの例) をダウンロードできますが、これらはもう利用できません。これらの 2 つの関数とその依存関係を、事前にコンパイルしてフォルダーに追加できる静的ライブラリ ファイルに含める方法を別の方法で考えている人はいますsrcか?

現在の(準)修正

次のことは(少し)私にとってはうまくいきました:http://gcc.gnu.org/wiki/GfortranBuildの指示に従って、Cygwinのフォルダーにlibblas.aとliblapack.aを手動でビルドし、/usr/srcメイクファイル。更新されたメイクファイルは、http: //thijsvandenbrande.be/phd/hamfemInstall/makefileNewにあります。

このコードは、cygwin から make コマンドを実行する (プロセスの次のステップ、Eclipse から実行する) ことにより、Windows でうまくコンパイルされます。そのフォルダーを別の場所に移動します。このプロセスは非常に手間がかかるため、すべてを理解するために、ここに回答を追加し、それを機能させるために cygwin に解析する必要があるコマンドを示します。

参考までに: 私のファイル構造は次のようになります (ビルド後、.exe ファイルを 1 フォルダー上に移動します。Linux バージョンと Windows バージョンの両方で):

  • hamfem.exe
    • 入力.txt
    • NGCR_Building01.txt
  • アウト
    • (ルーチンの出力ファイル用の空のフォルダー)
  • ソース
    • hamfem.f90 (メインファイル)
    • mainprog.f90 (lapack からのコマンドを含むファイル)
    • ...(他のモジュールの束)
    • メイクファイル
4

1 に答える 1

0

スタックオーバーフロー全体からのいくつかのポインターを使用して、私は自分で物事を理解しました。他の人が同様の問題を解決するのを助けるために、質問が完全に文書化されるように、ここで私の作業方法を希望します.

この問題は、ローカル マシンの cygwin で Lapack ライブラリと Blas ライブラリをクリーン ビルドし、makefile で参照するライブラリ フォルダに liblapack.a と libblas.a ファイルを貼り付けることで解決できます。Lapack を静的に呼び出すことによってキャストされたエラーは、2 つのコマンドで使用される Blas のいくつかのルーチンの結果です。

これらは私が従った手順です:

  1. lapack.tgz および blas.tgz ファイルを Web サイトからダウンロードし、フォルダーに貼り付けC:\Cygwin\usr\srcます。
  2. cygwin で次のコマンドを使用して、これらのファイルを抽出します。

    cd /usr/src 
    tar -xvzf lapack.tgz
    tar -xvzf blas.tgz
    
  3. 以下に示すコマンドを使用して、Cygwin で 2 つのライブラリ ファイルをビルドします。Lapack のコンパイルには時間がかかる場合があり、テスト ファイル内のいくつかのリンクが欠落しているため、最終的にいくつかのエラーが発生します。これらのテストは、正確なツールのために実行されます。make.incこれらの問題を解決するには、ファイルをさらに詳しく調べる必要があります。

    cd $HOME 
    cd /usr/src/BLAS
    make
    mv blas_LINUX.a ../libblas.a
    cd ../lapack-3.4.2
    mv make.inc.example make.inc
    make
    mv liblapack.a ../liblapack.a
    
  4. ライブラリへの正しいリンクについては、このリポジトリに含まれているメイクファイルを確認してください。これらは/usr/srcおよび と-static -llapack -lblas表示され、その他のオプションは Linux コンパイラ用です。

于 2013-07-29T13:21:44.327 に答える