从c++调用Fortran子程序,链接时引用未定义

Calling Fortran subroutine from C++, undefined reference when linking

本文关键字:链接 引用 未定义 子程序 c++ 调用 Fortran      更新时间:2023-10-16

我有一个Fortran子程序,我想从c++程序中调用它。它接受一长串浮点实参,并使用iso_c_binding内部模块:

subroutine parasolve ( ...... ) bind (c, name='c_parasolve')
  use,intrinsic :: iso_c_binding
  implicit none
....

根据我所阅读的内容,我明白我需要使用c++的"extern"命令来定义外部函数,然后再调用它。我试了两种方法。第一:

extern "C" void c_parasolve( .... );

在编译时返回"字符串常量前预期的非限定id ",而第二个:

extern void c_parasolve( .... );

编译得很好,但无法链接到"未定义的引用"c_parasolve(....)

我正在编译:

g++ -c main.cpp

,和

gfortran -ffree-form -std=f2003 -c parasolve.f03

将它们放入。o elf中,然后尝试链接:

g++ main.o otherfiles.o parasolve.o -lgfortran

调用这个Fortran函数的正确方法是什么?

看起来您的extern "C"声明在函数或类定义内部。这是不允许的——它必须位于源文件的顶层。(是的,错误消息可以提供更多信息!)