在我的编译器中,一个名为“func”的函数将在 fortran 中编译后重命名为 _FUNC@*。而如果ac代码使用_stdcall调用约定,那么函数名,例如Ab,在编译后会被重命名为_Ab@*。因此,这可以为 fortran 和 c 之间的混合编程提供一种简洁的方法。以下是我的代码。源1.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。编译器是visual c++。ccode.c 将生成一个 .lib,fortran 项目将使用它。这将在调试模式下成功运行。但是当我将项目更改为发布模式时,就会出现错误。错误是Source1.f90中的main函数找不到_SUBPRINT。请注意,我已经在发布模式下生成了 .lib 并将其添加到 fortran 项目中。
混合编程的另一种方法是使用 _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
为什么会这样?我将所有这些代码放在同一个解决方案中。所以配置是一样的。