从C ++调用Fortran子例程,链接时未定义引用

时间:2014-06-26 04:56:12

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

我有一个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( .... );

在编译时返回“字符串常量之前的预期unqualified-id”,而第二个:

extern void c_parasolve( .... );

编译得很好但无法链接“未定义引用'c_parasolve(....)'”并且ld返回1.

我正在编译:

g++ -c main.cpp

等,

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

让他们进入.o ELF然后尝试链接:

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

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

1 个答案:

答案 0 :(得分:5)

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