在Visual Studio 2010中从Fortran调用C ++函数

时间:2014-08-17 11:41:35

标签: c++ fortran fortran-iso-c-binding

我想从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 ( "%s\n", text );

  return;
}

提前多多感谢。

1 个答案:

答案 0 :(得分:1)

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

因此,问题的解决方案是

  • 使用C编译器编译,因此您可以获得实际的C代码,
  • 或告诉C ++编译器您确实要声明C函数。

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

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

如果您希望能够以C和C ++编译代码,可以使用

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

符号__cplusplus是为C ++定义的,但不是为C定义的,因此您的代码将在两者中都有效(当然只要代码的其余部分也保留在该子集中)。