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

FORTRANとVC++の混在するプロ...
 
通知
すべてクリア

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


なんで
 なんで
(@なんで)
ゲスト
結合: 17年前
投稿: 1
Topic starter  

以前の質問「FORTRANとVC++の混在するプログラミング」と同じ質問で申し訳ないです。

インテルfortran9.1で作成したDLLをvc2005でリンクしたいのですが、できなくて
困っています。ご教授下さい。

fortran側ソースは

subroutine DLL1
!DEC$ ATTRIBUTES DLLEXPORT::DLL1
end subroutine DLL1

としてます。

vc側では、

extern C __declspec(dllimport) void __stdcall DLL1();
int _tmain(int argc, _TCHAR* argv[])
{
DLL1();
return 0;
}

と呼び出しています。

vcのプロジェクトには、fortranで作成したlibを追加してます。

リンク時に次のメッセージが表示されます。
dllimport.obj : error LNK2019: 未解決の外部シンボル __imp__DLL1@0 が関数 _wmain
で参照されました。


引用解決済
トピックタグ
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

多分名前修飾の規則が違います。
>DUMPBIN.EXE /EXPORTS 対象ライブラリ(.libでも.dllでも)
で実際の名前を調査可能かと思います。
Dependency Walker等で.dllを調べても分かります。

実際の名前によって
・__imp__DLL111@0(?DLL000@@YAXXZ)
  →extern C __declspec(dllimport) void __stdcall DLL111();
・__imp__DLL110
  →extern C __declspec(dllimport) void DLL110();
・_DLL101@0
  →extern C void __stdcall DLL101();
・_DLL100
  →extern C void DLL100();
・__imp_?DLL011@@YGXXZ
  →__declspec(dllimport) void __stdcall DLL011();
・__imp_?DLL010@@YAXXZ
  →__declspec(dllimport) void DLL010();
・?DLL001@@YGXXZ
  →void __stdcall DLL001();
・?DLL000@@YAXXZ
  →void DLL000();
と宣言します。
どれにも当てはまらない場合は
・LoadLibraryとGetProcAddressを使って動的に読み込む
・Fortranのコンパイルオプションで出力名を制御する
・Fortran側で出力名が一致するよう名前を変える
・リンク直前にオブジェクトファイルを書き換えてしまう
・予めDLLとLIBを書き換えてしまう
等の手段があります。
完全に無修飾でインポートする方法があっても良さそうで
すが、私は知りませんのでそこは他の方に任せます。

参考:
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200704/07040035.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200102/01020026.txt


返信引用
特急
 特急
(@特急)
ゲスト
結合: 17年前
投稿: 1
 

ああ


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました