1

ライブラリにコンパイルされた、Fortran と C のソース ファイルが混在するコード (私のものではない) をコンパイルしようとしています。このライブラリは、直接リンクすることも、(より便利に) Python クラスから駆動することもできます。以前、g77 と gcc を使用してコードを 32 ビットとして正常にビルドしましたが、コードが大きなメモリ チャンクを使用し、64 ビットにする必要がある状況に遭遇しました。

gfortran 4.2.3 (AT&T R プロジェクトのバイナリ dist) とシステム gcc (4.2) を使用して、64 ビットのみ、またはユニバーサル バイナリとしてビルドしようとしました。ソース ファイルは正しくビルドされますが、ライブラリにリンクしようとすると、多くの Fortran 関数で「未定義のシンボル」エラーが多数発生します。ライブラリの nm は、シンボルが存在するように見えることを示していますが、明らかにリンカはそれらを見つけていません。

コンパイル コマンドのうちの 2 つ (多数のうち) を次に示します (エラーは発生しません)。

/usr/local/bin/gfortran -arch ppc -arch i386 -arch x86_64  -fPIC -fno-strength-reduce -fno-common -ff2c -Wall -c  lsame.f

gcc -c -I/Users/keriksen/Research/atomic_data/fac -I/Users/keriksen/Research/atomic_data/fac/faclib -O2 -fPIC -fno-strength-reduce -fno-common pmalloc.c

そして、爆撃するリンクステップ:

gcc -o sfac sfac.c stoken.c -I/Users/keriksen/Research/atomic_data/fac -I/Users/keriksen/Research/atomic_data/fac/faclib -O2 -fPIC -fno-strength-reduce -fno-common -L/Users/keriksen/Research/atomic_data/fac -lfac -lm -lgfortran -lgcc

サンプルの未定義シンボル:

  "_acofz1", referenced from:
      _HydrogenicDipole in libfac.a(coulomb.o)
      _HydrogenicDipole in libfac.a(coulomb.o)

およびそのシンボルが存在することを示す対応する nm:

    niobe:atomic_data/fac[14] nm libfac.a | grep acof

0000000000000000 T _acofz1_
0000000000002548 S _acofz1_.eh
                 U _acofz1

リンカーに必要なスイッチを含めないなど、何か愚かなことをしていますか、それとももっと微妙なことがここで起こっていますか?

4

1 に答える 1

1

Yujiの提案によると:

C/Fortran の互換性の問題を処理する cfortran.h ヘッダー ファイル (Web で入手可能で、かなり広く使用されているようです) は、そのままでは gfortran を処理しません。私はこの事実を無視するために(誤って)それをハッキングし、私の傲慢さの代償を払いました。

具体的な問題は、gfortran は末尾にアンダースコアが付いたシンボルを含むオブジェクト コードを生成しますが、gcc は生成しません。

正しいことは、環境変数 CPPFLAGS を -Df2cFortran に設定することでした。このマクロが設定されると、cfortran.h は呼び出し元の C 関数のオブジェクト コード内のシンボルに必要なアンダースコアを追加し、リンカは満足します。

この特定の例でもう 1 つ驚くべきことは、configure スクリプトが F77 環境変数で Fortran コンパイラの名前を調べたことです。F77 を「/usr/local/bin/gfortran -arch x86_64」に設定すると、生成された Makefile は正しく、64 ビットのみのオブジェクト コードが生成されました。これが標準の構成動作なのか、それともこの特定のスクリプトの特性なのかはわかりません。

結論として、ダウンロードした 64 ビット Python でうまく動作する 64 ビット共有ライブラリができました。戻って、システム python で動作するユニバーサル ライブラリを作成することを半分考えていますが、運命を誘惑したいのかどうかはわかりません。

于 2011-08-23T15:55:04.073 に答える