以前の質問「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
で参照されました。
多分名前修飾の規則が違います。
>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
ああ