4

からmvndst_()サブルーチンを呼び出すC++プログラムを書きたい

http://www.math.wsu.edu/faculty/genz/software/fort77/mvndstpack.f

Linuxで、test.ccを作成すると、次のようになります。

extern "C" {
    int mvndst_(int *, double *, double *, int *, double *, int *,
                double *, double *, double *, double *, int *);
};
int main() {
    return 0;
}

を介してコンパイルします

g++ -c -o test.o test.cc
gfortran -c -o mvndstpack.o mvndstpack.f
gfortran -Mnomain -o test test.o mvndstpack.o

それから私は得る

mvndstpack.o: In function `main':
mvndstpack.f:(.text+0x4a2a): multiple definition of `main'
test.o:test.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status

ただし、strip -N main mvndstpack.oリンクする前に実行すると、リンクは成功します。-Mnomainフラグがここで機能しなかった理由を誰かが説明できますか?また、Mac OS Xでの「ストリップ」の動作が異なるように見えるため、「ストリップ」を使用するソリューションは避けたいと思います(つまり、-Nオプションは使用できず、別の方法がわかりません。正しい動作を取得します)。また、可能であれば、元のFortranソースの編集は避けたいと思います。

詳細:-GNU Fortran(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1-g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1-GNUストリップ(Ubuntu用GNU Binutils)2.21.53.20110810-MacOS上のストリップX10.6スノーレオパード

4

2 に答える 2

4

-Mnomainオプションのドキュメントは見つかりgfortranませんが、文句はありません (リンカーに渡されているようです)。しかし、私が走ったときも文句を言いませんでした

gfortran -Mnoplatypus -o test test.o mvndstpack.o

したがって、それは をサポートしておらず-Mnomain、黙って無視されていると思います。(それか、-Mnoplatypusオプションがありますが、それはほとんどありそうにありません。)

PROGRAM TSTNRM私にとってうまくいったのは、 ..ENDmvndstpack.f(15行目から62行目)をコメントアウトすることでした。

とにかく、それはおそらく最も賢明なアプローチです。Fortran のメイン プログラムを使用したくない場合は、リンカーをだまして無視させるよりも、コンパイルしないほうがよいでしょう。

#if ... #endif(必要に応じて、またはを使用できます#ifdef ... #endif。)

編集:

メイン プログラムは C++ で記述されているため、実行可能ファイルを作成するg++には、 ではなくを使用する必要があります。gfortran

g++ -c -o test.o test.cc
gfortran -c -o mvndstpack.o mvndstpack.f
g++ -o test test.o mvndstpack.o

(そして、ある時点で、実際に関数を呼び出したいと思うでしょう。)

于 2011-10-17T01:27:12.340 に答える
2

あなたの問題は、あなたが持っているFORTRANコードにもaが含まれていることです。mainその世界では、それはPROGRAM. mvndstpack.fから:

      PROGRAM TSTNRM
*
*     Test program for MVNDST
*

フェンスのどちら側でパーティーを開催するかを最初に決める必要があります。

この場合、C++ で FORTRAN を呼び出す必要があるため、プログラムを含む FORTRAN ファイルの先頭部分を削除するTSTNRMか、条件付きコンパイル セクションでラップする必要があります。

#if TEST
      PROGRAM TSTNRM
...
      END
#endif

次に、ファイルの名前を (大文字と小文字が区別されます)mvndstpack.Fまたはに変更するか、コマンド ライン オプションで gfortran を使用しますmvndstpack.FPP-cpp

于 2011-10-17T01:42:29.543 に答える