0

典型的な目的のための私の Visual Studio 2010 ソリューション ファイルは、1 つの fortran プロジェクト (静的ライブラリ タイプで、source1.f90 で構成される)、1 つの C/C++ プロジェクト (アプリケーション タイプで、main.cpp を含む)、および 13 の C/C++ プロジェクト (スタティック ライブラリ タイプであり、クラスごとに異なる .cpp/.h ファイルが含まれています)。私の目的は、C/C++ スタティック ライブラリ タイプ プロジェクトの 1 つから Fortran ソース ファイル内のいくつかの関数を呼び出すことですが、プログラムをビルドできず、エラーが発生しています。

私の最初の試みは、main.cpp から fortran サブルーチンを呼び出すことでした。しかし、次のエラーが発生します。

Error    2    error LNK2019: unresolved external symbol "void __cdecl 
bar_ftn(int,char *)" (?bar_ftn@@YAXHPAD@Z) referenced in function _main 
G:\VS2010\uakron\sourcefiles\application\main.obj
Error    3    error LNK1120: 1 unresolved externals    G:\VS2010\uakron
\build\win\debug\application_app.exe    1

source1.f90

subroutine bar_ftn ( len_input_file, input_file ) bind( c )
    use, intrinsic :: iso_c_binding, only : c_int
    implicit none
    integer(c_int), value, intent(in) :: len_input_file
    character(len=1), intent(in) :: input_file(len_input_file)

    ! Local declarations (copy c char array into fortran character)
    character(len=len_input_file) :: infile
    integer :: i

    print *, "in bar_ftn"
    print *, len_input_file
    do i=1,len_input_file
    end do
end subroutine bar_ftn

main.cpp

#include<iostream>
#include<fstream>

using namespace std;
extern void bar_ftn ( int flag_len, char* flag );
static void
DisplayUsage(char* programName);

int main(int argc, char *argv[])
{
    char ctext[]="helloworld abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz";
    int ctext_len=sizeof(ctext);

    //Call the Fortran
    bar_ftn( ctext_len, ctext );

    return 0;
}

一方、C/C++ スタティック ライブラリ プロジェクトのいずれかのクラス関数の 1 つから fortran 関数も呼び出しましたが、同じタイプのエラーが発生しています ( LNK2019)。

どんな助けでも大歓迎です。

4

1 に答える 1

2

bar_ftn1 つの問題は、C++ で宣言しているため、エラー メッセージに表示される奇妙なテキストであるname manglingが発生することです。これを避けるには、関数宣言の前?bar_ftn@@YAXHPAD@Zに追加する必要があります。extern "C"

extern "C" void bar_ftn ( int flag_len, char* flag ); // note that 'extern' by itself is unnecessary
于 2013-07-30T14:16:32.057 に答える