1

私のコンパイラでは、「func」という名前の関数は、fortran でコンパイルした後に _FUNC@* に名前が変更されます。また、ac コードが _stdcall 呼び出し規則を使用する場合、関数名 (例: Ab) は、コンパイル後に _Ab@* に名前が変更されます。したがって、これは、fortran と c の間の混合プログラミングの簡潔な方法につながる可能性があります。以下は私のコードです。source1.f90

program main
implicit none
call subprint()
read(*,*)
endprogram

ccode.c

#include <stdio.h>
#ifdef _cplusplus
extern "C" {
#endif
  void _stdcall SUBPRINT()
{printf("hello the world\n");}
#ifdef _cplusplus
}

私のプラットフォームは win 7 で、vs2010 が使用されています。コンパイラはビジュアルC++です。ccode.c は .lib を生成し、fortran プロジェクトはそれを使用します。そして、これはデバッグモードで正常に実行されます。しかし、プロジェクトをリリース モードに変更すると、エラーが発生します。エラーは、Source1.f90 の main 関数が _SUBPRINT を見つけられないことです。リリース モードで .lib を既に生成しており、それを fortran プロジェクトに追加していることに注意してください。

混合プログラミングのもう 1 つの方法は、_cdecl 呼び出し規約を使用することです。次のコードは、デバッグ モードとリリース モードの両方で正常に実行されます。

module abc
  interface
    subroutine subprint()
      !dec$ attributes C,alias:'_subprint'::subprint
    end subroutine
  end interface
end module

program main
  use abc
   implicit none
   call subprint()
   read(*,*)
endprogram

ここにcコードがあります。デフォルトの呼び出し規約は _cdecl です。

#ifdef _cplusplus
extern "C" {
#endif
 void  subprint()
 {printf("hello the world\n");}
#ifdef _cplusplus
}
#endif

なぜこれが起こったのですか?これらすべてのコードを同じソリューションに入れました。なので構成は同じです。

4

1 に答える 1

4

SUBPRINTまず、あなたの C 関数は ではないことに注意してください。それは C のsubprint中でも重要です。

次に、__cplusplusではなくを使用する必要があります。_cplusplus

第三に、C との相互運用性のために最新の Fortran を使用するだけです。

c.cc:

#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
  void subprint(){
   printf("hello the world\n");
  }
#ifdef __cplusplus
}
#endif

f.f90:

program main
implicit none

interface
  subroutine subprint() bind(C,name="subprint")
  end subroutine
end interface

call subprint()
read(*,*)
endprogram

gfortran c.cc f.f90

./a.out
hello the world
于 2013-06-14T10:33:17.333 に答える