FORTRANとVC++の混在するプログラミング

[戻る]
AK 2007/02/09(金) 20:33:11
FORTRANからVC++で記述した関数を呼び出すにはどうすればよいでしょうか?同じプロジ
ェクト内にFORTRANファイルとVC++ファイルを入れてコンパイルできるのでしょうか。い
ろいろ調べて試したのですがうまく行きません。分かりやすく説明されたページなど分
かれば教えてください。ちなみに、INTEL FORTRAN V9.1と.NETまたはVS2005を使用して
います。よろしくお願いします。

ぬふや 2007/02/13(火) 17:18:22
「コンパイル」は無理。
その言語がVCと互換性のあるライブラリファイルないしオブジェクトファイルを出力
できるのなら「リンク」が出来る。

その場合、コマンドラインからその言語のコンパイラを呼び出すMakeFileを含むプ
ロジェクトをつくり、ワークスペースに組み込めます。
ってプロジェクトじゃなくてワークスペースでしたすいません。
一応カスタムビルドでも同様のことが出来る筈です。

なので、INTEL FORTRAN V9.1がVCでリンクできるライブラリファイルないしオブ
ジェクトファイルを出力できるかどうかに掛かっていると思います。

ITO 2007/02/16(金) 19:47:37
調べてる?
http://www.clubsse.com/intel/compilers/index.html#compilers
「INTEL FORTRAN V9.1」でぐぐるといろいろでてくるよ。
一様リンクできるようなことが書いてあります。
ちなみに製品名
 INTEL Visual FORTRAN V9.1
ですね。

ぬふや 2007/02/16(金) 23:33:27
一般的な事言っただけなので調べませんでした。

ITOさんの挙げたページだと、
C++のほうは「Microsoft Visual C++ 6.0 (以降のバージョン) とソース/オブジェ
クトの互換性、Microsoft Visual C++ .NET とオブジェクト・ネイティブ・コードの
互換性を提供します。」
に対してFortranのほうは「ソースおよびコマンドに関しては Compaq Visual 
Fortran と強力な互換性があり、v9.1では、Microsoft Visual Studio 2005 に
対応しました。」

とのことで、IDEが使えるとは言っていますがそれだけで、ライブラリやオブジェクトが
互換性があるとは言及されていないようです。
C++のほうでそれを書いていることから、出来ないような印象を受けます。
なので、DLLなどを作る場合はいいかもしれませんが、直接は微妙ではないで
しょうか。

どう思いますか?

ITO 2007/02/17(土) 13:07:25
こんな記述がありますが、
 
> 最新の Microsoft 統合開発環境を利用してアプリケーションを開発できます。 
> v9.1では、Microsoft Visual Studio 2005への統合機能をサポートしました。
> Microsoft Visual Studio 2005 との統合には、クロスプラットフォーム開発
> が含まれます。 

>とのことで、IDEが使えるとは言っていますがそれだけで、ライブラリや
>オブジェクトが互換性があるとは言及されていないようです。
そうですね、メーカに問い合わせる必要もありそうですね。

やす 2007/02/20(火) 09:51:03
INTEL FORTRAN V9.1と.NETまたはVS2005の統合環境で開発してます。

FORTRANからVC++で記述した関数を呼び出すことも、その逆も可能です。
ただしFORTRANとCのソースを1つのプロジェクトに入れることはできません。
呼び出される方の関数をスタティックライブラリかDLLのプロジェクトに
してください。

なお、相互の呼び出しに関する注意事項に関しては、オンラインヘルプの
「言語が混在したプログラミング」の章をよく読んでください。

PATIO 2007/02/20(火) 17:38:52
> FORTRANからVC++で記述した関数を呼び出すことも、その逆も可能です。
> ただしFORTRANとCのソースを1つのプロジェクトに入れることはできません。
> 呼び出される方の関数をスタティックライブラリかDLLのプロジェクトに
> してください。

こういう話なら、ぬふやさんの話で大筋間違って無いと思います。
別プロジェクトで管理するなら一般的な運用とあんまり変わらないかなぁ。
とは言え、一つのソリューションで管理できるならバラで管理するよりは
管理しやすいでしょうし、IDEも共通で使えるならメリットはありますね。

AK 2007/02/27(火) 11:10:26
VC++からFortranのDLLを呼び出す方法は以下のようにできました。
VC++の中で、

extern "C" _declspec(dllimport)
void _stdcall FORTRANDLL(int *)
を宣言し、FortranのDLLプロジェクトでは、

subroutine FORTRANDLL(i)
!DEC$ ATTRIBUTES DLLEXPORT :: FORTRANDLL

またVC++のプロジェクトに、FORTRANDLL.libを追加しています。

逆に、FortranからVC++のスタティックライブラリを呼び出す方法が分かりません。VC++
からVC++のスタティックライブラリを呼び出すことはできています。具体的にVC++と
Fortranプログラムの中での記述方法を教えていただけないでしょうか。

また、VC++からFortranのスタティックライブラリを呼び出す方法も分かるとうれしいで
す。

tetrapod 2007/02/27(火) 11:34:05
俺は今は fortran 使ってないけど
要するに fortran の function は vc でいう __stdcall かつ引数が参照、なだけ。
んで C 互換な名前がつく。fortran の参照引数は C ではポインタになるわけだ。
だから fortran 側の引数 INT は C 側引数 int* ということ。

fortran 側 real function hoge(n, x) を C++ から呼ぶなら
extern "C" /*__declspec(dllimport)*/ double hoge(int* n, double* x); と宣言
DLL なら /**/ 内を有効にし static library なら /**/ 内は不要
C++ でなく C なら extern "C" が不要

逆も真なり fortran から C++ の関数を呼びたいなら先のように宣言すればいい
/**/ 内部が dllexport になるだけ (static library なら不要)

subroutine なら結果が無いから C 側の関数の返却値は void
recursive を使っている場合は自分で調べてね

ただし C/fortran の混在をさせる場合には初期化ルーチンを呼び合っておく
必要があったりするかもしれない。

やすさんの指摘どおりまずは自分でヘルプをみなされ

古いスレッドには追加発言できません。