• ベストアンサー

FortranからCの関数を呼ぶ方法

お世話になります。 標記件、以下の通り行っていますがうまくいきません。どなたかご存知の方おりましたらご教示下さい。よろしくお願いします。 (1)環境 ・Windows XP SP2 ・Compaq Visual Fortran Professional Edition 6.5.0 ・Visual C++ 6.0 Enterprise Edition (2)作業方法 ・Visual C++ を立ち上げ、その中でCプログラムとFortranプログラムのファイルを作成し、作業。 (3)現象 ・ビルドしようとすると以下のエラーが発生し、EXEが作成されない。 ------------------------------- Linking... LINK : warning LNK4098: defaultlib "libc.lib" conflicts with use of other libs; use /NODEFAULTLIB:library test01.obj : error LNK2001: unresolved external symbol _TEST@0 Debug/system.exe : fatal error LNK1120: 1 unresolved externals -------------------------------  ・個々のファイルのコンパイルは問題なし。 (4)ソース内容  --- Fortranプログラム"test01.f90" --- PROGRAM FileRW call test END  --- Cプログラム"system.cpp" --- #include <stdio.h> void test_(void) { printf("TEST PROGRAM!!"); } 以上

質問者が選んだベストアンサー

  • ベストアンサー
  • tea_sheep
  • ベストアンサー率53% (8/15)
回答No.5

「@0」がついているところを見ると __stdcall も必要なようです。 extern "C" void __stdcall TEST(void) {  … }

seicocco9640
質問者

お礼

回答頂いた方法で、EXE作成できました!! 大変×10助かりました。 tea_sheep様、他にご回答頂いた方含めまして、 この場でお礼申し上げます。 ありがとうございました!m__m

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

なんというか, Fortran の方で「_TEST@0」という名前を要求してるみたいなんだけど.... C とのやりとりの方法って, Compaq Visual Fortran のマニュアルに書いてないのかなぁ? さておき, Fortran 2003 には手続の属性として BIND というのが定義されていて, これを使うと「C で書いた関数の名前」も指定できる, みたい.

  • tea_sheep
  • ベストアンサー率53% (8/15)
回答No.3

> test01.obj : error LNK2001: unresolved external symbol _TEST@0 このコンパイラ出力を見る限りでは、Fortranの関数名は大文字になっているようですね。 Fortranは大文字・小文字を区別しないので、すべて大文字に統一されているようです。 なのでC++の方を大文字の関数名にすればよいのではないでしょうか。 (記憶によればコンパイルオプションで全大文字か全小文字かを変更できたような…。 べつの種類のFortranコンパイラだったかもしれませんが。) あと、C++の方をC言語の名前付け規約に従わせるために「extern "C"」をつける必要があると思います。 ファイルが「.c」の場合には必要ありません。 extern "C" void TEST(void);

seicocco9640
質問者

お礼

返信遅くなり申し訳ありません、 ご回答頂き、ありがとうございました。 (1)C++の方の関数名を大文字にしてTRYしましたが、    同じくエラーが出てしまいました。「TEST」「TEST_」でも    TRYしてみましたが、どちらも駄目でした。 (2) (1)に加えて、「extern "C"」もTRYしましたが、同じ    エラーが発生しました。 せっかくご教示頂いたのに、すみません。。

noname#26650
noname#26650
回答No.2

回答No.1の者です。 void test(void) と、アンダースコアを全く付けないケースは お試し済みでしょうか。

seicocco9640
質問者

お礼

またまたご回答ありがとうございました。 アンダースコアを付けないで試しましたが、 同じエラーが発生してしまいます。 ご面倒お掛けします。 以上

noname#26650
noname#26650
回答No.1

system.cppで、 >void test_(void) のところを void _test(void) に修正してみたら、どうなるでしょうか。 リンク時のメッセージを見ると >unresolved external symbol _TEST@0 となっていますので、関数名の先頭にアンダースコアが 必要なのではないかと思います。

seicocco9640
質問者

お礼

早速のご回答、ありがとうございました。 _test で試しましたが、以下の通り同じエラーが出てしまいます。 (エラーログ) test01.obj : error LNK2001: unresolved external symbol _TEST@0 以上

関連するQ&A

  • LIBCMT.LIBをリンクしてコンパイルすると警告が。

    LINK : warning LNK4098: defaultlib 'LIBC' conflicts with use of other libs; use /NODEFAULTLIB:library というのがでるんですけど、もともとリンクしているLIBCというライブラリ?と、関数がかぶってしまっているためなんでしょうか。 /NODEFAULTLIBオプションを使え?みたいなことを言ってますが、 cl /? で調べてもそんなオプションありませんし。 この場合の解決法のご教授をお願いします。

  • c言語とfortranの混在プログラミング

    cとfortranの混合プログラミングについての質問です。環境はWindows上でVisual studio 2005/Intel fortran 9.1です。 --c側(ctest6.cpp) #include <stdio.h> extern "C" void __stdcall fsub(){ printf("TEST PROGRAM!!\n"); } --fortran側(ftest6.f90) PROGRAM MAIN call FSUB END --エラー ctest6.obj:error LNK2019:未解決の外部シンボル_fsubが関数_mainで参照されました。 ftest6.obj:error LNK2019:未解決の外部シンボル_FSUBが関数_MAIN_で参照されました。 ftest6.exe:fatal error LNK1120:外部参照2が未解決です。 ---- __stdcall fsub()"の部分を過去の質問等を参考にし、色々(cのfsubを_fsubやfsub_にしたりと"_"を追加したり)と試してみたりしたのですが、上記のエラーがでてしまいます。fortran側で_FSUBと記入できない点が課題な気がしているのですが、ご教授いただけないでしょうか?

  • エラーについて

    Visual studio net 2003 で list10-7というウィンドウズプログラム作ってDebugをしたところ、 error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "unsigned long __stdcall ThreadFunc(void *)" (?ThreadFunc@@YGKPAX@Z) と fatal error LNK1120: 1 unresolved externals という2つのエラーが出ました。ThreadFuncというのは自作のスレッド関数です。上記のエラーから、なんとなくtimeGetTime関数に何か問題があると思うのですが、全くわかりません。AlphaBlend関数を使うときライプラリmsimg32.dllを追加しましたが、timeGetTime関数も何かライプラリが必要なのでしょうか? 

  • Fortranについて,fatal error LNK1181

    Fortranをインストールしてプログラムをコンパイルしようとすると,以下のエラーが出ます. LINK : fatal error LNK1181: cannot open input file "C:\DOCUME~1\dfor.lib" 正常に作動させるにはどうしたらいいでしょうか.何か足らないものがあるのでしょうか.以下のフォルダに, インストールCDに入っているLIBファイルをすべてコピペしてみたのですが,変わりなしです. C:\Program Files\Microsoft Visual Studio\DF98\LIB OSはXP,今回インストールをしたFortran及びプログラム作成をしたFortranは,共にVisual Fortran 6.0です.何か打開策があれば助言お願いします.

  • FORTRANとC++の連動について

    私は,Fortranを用いて解析の業務をしている,プログラム初心者です。 購入したのは,Intel Visual Fortran8.0(VF)ですが,Windows環境でコンパイルリンクするには,Microsoft Visual C++ .NET 2003(VC++)が必要ということで,こちらも購入しました。 普段は,Fortranのコンソールで ifort **.f といったコマンドでコンパイルリンクし,実行しているだけです。 これからは,VC++の方に移行していきたいと考えていますが,しばらくはFortranで作成したサブルーチンを有効活用したと考えています。 そこで,VC++ベースのメインプログラムからFortranのサブルーチンを呼び出すプログラムの作成方法,コンパイルリンク方法をご教授ください。よろしくお願いします。 (1)ソースにどう記述するか? void CMyDlg::OnBnClickedOk() { ここで,FORTRANのサブルーチンを呼び出したい。     Fortranなら call subroutine( a, b ) } (2)コンパイルするときは, Visual Studio開発環境で,コンパイル→実行で良いのか? それとも,あらかじめVC++とVFで.objファイルを作成する必要があるのか?

  • Visual C++ 初心者です。

    Visual C++ 2005 Express Editionをダウンロードしました。 void main() {printf ("Hello World"); getchar();} をビルドしたところ、 MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 とエラーが出ました。 何が問題なのでしょうか。 全く初心者で、周りに質問できる人もいなくて、このアプリケーションを使わなければいけない状況です。 諸事情あって今日はもうパソコンを開けないのかもしれませんので、 お礼は遅くなると思いますが、よろしくお願いします。

  • CとFORTRANのリンクについて

    C/C++(MAIN)とFORTRAN(SUB)のリンク時エラーの対応策をご教授願いたい 環境(WIN2000/Visual Studio .NET 2003統合環境/IntelFortran9.0/にて FORTRAN(SUB)をLIBとして、C/C++プロジェクトにてリンクしようとして 参照エラーが多発する  ▼問題のリンクエラーメッセージ--------------------------------- error LNK2019: 未解決の外部シンボル _for_emit_diagnostic が関数 _input で参照されました。 同上 _for_open が関数 _input で参照されました。 同上 _f_ldnint_val が関数 _ransu で参照されました。 その他、同上エラーが多発 -------------------------------------------------------------- 多分、FORTRAN側のライブラリ関係が、Cリンカーに設定できていないのでは と推測し検討中だが、手がかりがつかめない状態です 何かヒントでもあれば幸いです。

  • .exeファイルが開けません

    Visual C++ 2005 Express Editionを使用しています プログラムをコンパイルしてそのEXEファイルを友達に渡したんですが このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。 アプリケーションを再度インストールす事により問題が解決する場合があります。 と言うエラーが出るらしく実行できません 調べてみたらランタイムライブラリをマルチスレッド(/MT)にすると直るということはわかったんですが マルチスレッド(/MT)にするとエラーが出てしまいます main.obj : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) は既に msvcprtd.lib(MSVCP80D.dll) で定義されています。 LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。。 libcpmtd.lib(cin.obj) : error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__malloc_dbg" は未解決です。 libcpmtd.lib(xdebug.obj) : error LNK2019: 未解決の外部シンボル __free_dbg が関数 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) で参照されました。 libcpmtd.lib(xmbtowc.obj) : error LNK2001: 外部シンボル "__free_dbg" は未解決です。 C:\C++\計算\Debug\計算.exe : fatal error LNK1120: 外部参照 4 が未解決です。 エラーは文字数の関係で大幅に削ってあります 作成したプログラムも上げておきます http://www.uploda.net/cgi/uploader4/index.php?file_id=0000008742.exe よろしくお願いします

  • C++での質問です。

    C++での質問です。 http://homepage2.nifty.com/c_lang/index_sdk.html ここを見ながら勉強しようと思うのですが、イントロダクションに書いてあるプログラムをそのままVisual C++ 2010Expressでデバッグでビルドしようとしてもうまく行かず、 1>LINK : error LNK2001: 外部シンボル "_WinMainCRTStartup" は未解決です。 1>C:\Users\(中略).exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出ます。 リリースだとエラーは吐かないのですが、リリースフォルダ内にexeファイルが生成されず、やっぱり起動できませんでした。 Visual C++ 2010Expressはインストールしてほぼそのままなんですが、何かやっておかないといけないことはあるんでしょうか?

  • MISTのLAPACKの環境設定ができない

    こんにちは.質問させていただきます. 画像の主成分分析を行いたいと思っており,調べたところMISTというライブラリを用いれば用意にできるそうなので,早速使ってみました. しかし行列演算を行うためのLAPACKというものがうまく環境設定できていないようで,大量のエラーが出て困っています. 手順は下のURLのpdfに従い行っておりました. http://mist.suenaga.cse.nagoya-u.ac.jp/pdf/MIST_no_susume.pdf 環境設定もこのpdfの19ページに従い行いました. 上記のpdfのとおりにサンプルプログラムを順番に動かしてみたら,画像の入出力などは正常にできました. が,17ページのサンプルプログラムを実行しようとすると,以下のようなエラーが大量に出てしまいます. ===================================================== 1>MSVCRT.lib(ftol2.obj) : error LNK2005: __ftol2 は既に libF77.lib(ftol2.obj) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 (中略) 1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type は既に MSVCRT.lib(MSVCR100.dll) で定義されています。 1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>LINK : warning LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 1>C:\Documents and Settings\(ユーザ名)\My Documents\Visual Studio 2010\Projects\test\Debug\test2.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。 ===================================================== 使用環境はWindows XP,Visual Studio2010です. プログラミングは初心者です. .NETというものがよくわからないので,Visual Studioを使っているのですが,これが問題でしょうか?Visual Studioではできないのでしょうか?(画像の入出力などは正常に処理できたので,LAPACKの設定がうまくできていないだけだと自分では思っているのですが・・・) どなたか詳しい方がいらっしゃいましたら,教えてください. よろしくお願いいたします.

専門家に質問してみよう