混合编程在发布时失败,但成功进行了调试

时间:2013-06-14 09:18:22

标签: c visual-studio-2010 fortran release mixed-mode

在我的编译器中,在fortran中编译后,名为“func”的函数将被重命名为_FUNC @ *。如果一个c代码使用_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。 Compliler是visual c ++。 ccode.c将生成.lib,fortran项目将使用它。这将在调试模式下成功运行。但是当我将项目更改为发布模式时,会发生错误。错误是Source1.f90中的主要功能,无法找到_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

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

1 个答案:

答案 0 :(得分:4)

首先,请注意您的C函数是SUBPRINT而不是subprint,即使在C内部也是如此。

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

第三,只需使用现代Fortran与C:

进行互操作

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