私のコンパイラでは、「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
なぜこれが起こったのですか?これらすべてのコードを同じソリューションに入れました。なので構成は同じです。