1

在我的编译器中,一个名为“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

为什么会这样?我将所有这些代码放在同一个解决方案中。所以配置是一样的。

4

1 回答 1

4

首先,请注意您的 C 函数SUBPRINT不是subprint,即使在 C 内部也很重要。

其次,你应该使用__cplusplus,而不是_cplusplus

第三,只需使用现代 Fortran 与 C 进行互操作:

抄送:

#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 回答