0

我想从 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;
}

提前非常感谢。

4

1 回答 1

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 定义的,因此您的代码将在两者中工作(当然,只要您的其余代码也保留在该子集中)。

于 2014-08-17T12:50:26.043 回答