在Visual Studio 2010中使用Fortran调用c++函数

Calling C++ function from Fortran in Visual Studio 2010

本文关键字:Fortran 调用 c++ 函数 Visual Studio 2010      更新时间:2023-10-16

我想从Fortran调用一个c++函数。为此,我在Visual Studio 2010中创建了一个FORTRAN项目。之后,我将Cpp项目添加到该FORTRAN项目中。当我想要构建程序时,会出现以下错误:

Error 1: unresolved external symbol print_C referenced in function MAIN_main.obj    
Error 2:    1 unresolved externals

下面是Fortran程序和c++函数。

Fortran程序:

program main
  use iso_c_binding, only : C_CHAR, C_NULL_CHAR
  implicit none
  interface
    subroutine print_c ( string ) bind ( C, name = "print_C" )
      use iso_c_binding, only : C_CHAR
      character ( kind = C_CHAR ) :: string ( * )
    end subroutine print_c
  end interface
  call print_C ( C_CHAR_"Hello World!" // C_NULL_CHAR )
end
c++功能:

# include <stdlib.h>
# include <stdio.h>
void print_C ( char *text )
{
  printf ( "%sn", text );
  return;
}

您的问题是,由于您使用c++编译器进行编译,因此print_C不是C函数,而是c++函数。由于Fortran代码试图调用C函数,因此无法找到c++函数。

因此,你的问题的解决方案是

  • 或者用C编译器编译,这样你就得到了真正的C代码,
  • 或者告诉c++编译器你想要声明一个C函数。

后者使用extern "C"完成,如下所示:

extern "C" void print_C(char *text)
{
  printf("%sn", text);
}

如果你想同时编译C和c++的代码,你可以使用

#ifdef __cplusplus
extern "C"
#endif
void print_C(char *text)
{
  printf("%sn", text);
}

符号__cplusplus是为c++定义的,但不是为C定义的,所以你的代码将在这两种语言中工作(当然,只要你的代码的其余部分也保留在该子集中)。