在我的编译器中,在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
为什么会这样?我把所有这些代码放在同一个解决方案中。所以配置是一样的。
答案 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