• ベストアンサー

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と記入できない点が課題な気がしているのですが、ご教授いただけないでしょうか?

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

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

や, だから, 「呼び出されるルーチン」を (スタティックなりダイナミックなりの) ライブラリにする必要はないのかなぁ, と....

Kojisief
質問者

お礼

指摘していただいた方法でできました。 ありがとうございます。本当に感謝感謝です!!

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

C側の関数名を大文字にしてみれば ・・・ void _declspec( dllexport ) __stdcall FSUB() といった具合 ・・・

Kojisief
質問者

お礼

指摘していただいた方法もやってみましたが、原因はfortran側(呼び出される側)をスタティックかダイナミック以外で作成することのようでした。ともかくご回答していただきありがとうございました。

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

ちょいと調べたらこんなんが出てきました. 試していないので本当かどうかは知りません.

参考URL:
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200702/07020036.txt
Kojisief
質問者

お礼

さっそくのご回答ありがとうございます。 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200702/07020036.txtのtetrapodさんのアドバイスで fortran側はstaticlibrary,SUBROUTINEですので、 extern "C" void ftest6(); extern "C" void ftest6_(); extern "C" void _ftest6(); 等試してみましたが、同じエラーでした。 ちなみにビルドは cl /c ctest6.cpp ifort ftest6.f90 ctest6.obj /link /out:ftest6.exe で行っております。 ともかく、ご回答ありがとうございます。もう一度マニュアルを読み込んでみます。

関連するQ&A

  • DB2付きのC言語がコンパイルできません。

    CはMicrosoftVisualStudio2012 DBはIBM DB2 です。 同じ環境でコンパイル実行できていたのに、 PCがおかしくなったのでフォーマットして入れなおしたらコンパイルができなくなりました。 よろしくおねがいします。 ソースはこちらです。 #include <stdio.h> exec sql include sqlca; void main() { exec sql connect to sample; if(SQLCODE!=0) { printf("SQL CONNECT %d", SQLCODE); } else { exec sql update Test1 set col2 = 'bababa'; if(SQLCODE!=0) printf("SQL UPDATE %d", SQLCODE); } exec sql connect reset; } コンパイルコマンドです db2 connect to sample db2 prep Test11.sqc bindfile db2 bind Test11.bnd cl -Z7 -c -W2 -D_X86_=1 -DWIN32 -I"c:\Program Files\IBM\SQLLIB\include" Test11.c link -debugtype:cv -outTest11.exe %1.obj "c:\Program Files\IBM\SQLLIB\lib\db2api.lib" エラーメッセージです Test11.obj : error LNK2019: 未解決の外部シンボル _sqlaaloc@16 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlacall@20 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlasetdata@24 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastop@4 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastrt@12 が関数 _main で参照されました。 Test11.exe : fatal error LNK1120: 5 件の未解決の外部参照

  • C言語についてです。

    プログラムを実行しようとすると、 main.obj : error LNK2001: 外部シンボル ""void __cdecl DrawGameOver(void)" (?DrawGameOver@@YAXXZ)" は未解決です。 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リンカーに設定できていないのでは と推測し検討中だが、手がかりがつかめない状態です 何かヒントでもあれば幸いです。

  • Visual C++ 2005 Express EditionでLINK2019エラー

    Visual C++ 2003.netからVisual C++ 2005 Express Editionに移行した際に、以前書いたプログラムがリンクエラーで動かなくなってしまいました。 追加するLibディレクトリが足りないのかと思ったのですが、何が足りないのか見つけることができませんでした。 解決法を教えていただけないでしょうか。 OSはWindows XPです。 よろしくお願いします。 エラーメッセージの内容↓ ------------------------------- error LNK2019: 未解決の外部シンボル __imp__GetWindowPlacement@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DispatchMessageA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__TranslateMessage@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PeekMessageA@20 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ValidateRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ShowWindow@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__SetWindowPos@28 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetWindowRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetClientRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__CreateWindowExA@48 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetSystemMetrics@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__RegisterClassExA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__LoadCursorA@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DefWindowProcA@16 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PostQuitMessage@4 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 現在追加されているLibディレクトリ↓ ------------------------------------------- $(VCInstallDir)lib $(VCInstallDir)PlatformSDK\lib $(FrameworkSDKDir)lib $(VSInstallDir) $(VSInstallDir)lib C:\Program Files\Microsoft Platform SDK\Lib C:\Program Files\Microsoft DirectX SDK (April 2007)\Lib\x86

  • OpenNIの動作について

    OpenNIをvisual studio2008で動作させようとしています。 そこで以下のメッセージが出て動作しません。インクルードファイルのリンクはしたつもりなのですが、参照できていないのでしょうか。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniDeviceCreateStream" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniFrameRelease" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniDeviceIsPropertySupported" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniStreamGetSensorInfo" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniDeviceClose" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniShutdown" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniGetExtendedError" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniWaitForAnyStream" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniInitialize" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniStreamStart" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniDeviceGetInfo" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniStreamIsPropertySupported" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniDeviceOpen" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniDeviceGetSensorInfo" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniStreamDestroy" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniStreamStop" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniStreamReadFrame" は未解決です。 1>main.obj : error LNK2001: 外部シンボル "__imp__oniDeviceIsCommandSupported" は未解決です。 1>C:\Users\sakata\Documents\Visual Studio 2008\Projects\openNI_test\Release\openNI_test.exe : fatal error LNK1120: 外部参照 18 が未解決です。 以上です。 追加のインクルードディレクトリには C:\Program Files\OpenNI2\Include\Win32 C:\Program Files\OpenNI2\Include 追加のライブラリディレクトリには "C:\Program Files\OpenNI2\Lib" を追加しました。 環境変数はOpenNIをインストールしたときに勝手に追加されたので間違っていないと思います。 環境は以下です。 OS:Windows7 32bit OpenNIはOpenNI2を入れています。(2013年6月現在で最新?) もちろん32bit版です。 動作カメラはXtionです。ドライバインストール済みで、サンプルプログラムの.exeファイルでの動作は確認しています。 他の質問でx64でビルドすれば通るなどと書いてありますが、それは64bit版OSの話ですよね? 原因わかる方、回答お願いします。

  • プロジェクトを作った際のエラー

    VisualC++ 2005 Express Editionを使用してます win32コンソールアプリケーション - アプリケーション設定 - windowsアプリケーション この新しく作ったプロジェクトを何もいじらずにビルドすると __imp__EndPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__BeginPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DefWindowProcW@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DestroyWindow@4 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DialogBoxParamW@20 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__EndDialog@8 が関数 "int __stdcall About(struct HWND__ *,unsigned int,unsigned int,long)" (?About@@YGHPAUHWND__@@IIJ@Z) で参照されました。 C:\C++test\test\Debug\test.exe : fatal error LNK1120: 外部参照 19 が未解決です。 というエラーが出てしまいます 800文字オーバーしてしまうのでエラーの前半部分を消してあります この原因と解決方法を教えてください よろしくお願いします

  • C言語 エラー bcc developer プログラミング

    僕はbcc developerを使ってCプログラミングをしてるんですがしてるんですが今日いきなり【Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照】というようなエラーが出てきました。 困ってます。だれか教えてください↓

  • このエラーは??

    コンパイラーすると次のようなエラーがでました。 a.obj : error LNK2019: 未解決の外部シンボル _printfが関数_mainで参照されました。 a.exe : fatal error LNK1120: 外部参照1が未解決です。 このエラーはなんでしょうか??よろしくお願いします。

  • C++でのエラー LNK2001

    C++でプログラミング中ビルドしたところ以下のようなエラーが出ました。解決方法がわかりません。どのようにしたら解決できるのでしょうか? ---------------------------------------------------------------- コンパイル中... sample01.cpp リンク中... sample01.obj : error LNK2001: 外部シンボル "__imp__dispose_library" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_copyright_information" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_version_information" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__initialize_library" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__close_reader_writer" は未解決です sample01.obj : error LNK2001: 外部シンボル "__imp__get_last_error_types" は未解決です Debug/Sample01.exe : fatal error LNK1120: 外部参照 6 が未解決です。 link.exe の実行エラー

  • C++の関数をfortranから呼びたい。(intelFortran,

    C++の関数をfortranから呼びたい。(intelFortran, g++) いつもお世話になっています。 現在WindowsXP上で、MinGWのC++コンパイラのg++と intelFortranのifortコマンドを使用して、 fortranからc++関数を呼ぼうとしていますが リンクできません。 ソースは以下で紹介したものをそのまま使用しています。 http://okwave.jp/qa/q5806443.html 手順は、 D:\C>ifort -c helloFortran.f D:\C>g++ -c funcHelloC.cpp D:\C>ifort helloFortran.obj funcHelloC.o 結果は、 error LNK2019: 未解決の外部シンボル*****が関数**** で参照されました。 と数行出力されています。 お手数ですが、よろしくお願いします。