【问题标题】:Read C++ 'Hello World' from Fortran从 Fortran 读取 C++ 'Hello World'
【发布时间】:2016-04-06 22:09:25
【问题描述】:

我正在尝试验证一个用 c++ 编写的简单 hello world 函数可以从 FORTRAN 脚本(gfortran 4.9.20)中调用。我对 c++ 和 FORTRAN 都没有什么经验,所以我认为这是我应该开始的。

//code.cpp
#include <iostream>

extern "C"
{
  void worker();
  int main()
    {
      worker();
    }
  void worker()
    {
      std::cout << "Hello, World!\n";
    }
}

以及如下的标题

//code.h
#include "code.cpp"

extern "C"
  {
    void worker();
  }

我可以使用下面的简单代码在 c++ 中调用我的 hello 函数

//readheader.cpp
#include "code.h"

extern "C"
  {
    void worker();
  }

我认为一切都很好,直到我尝试使用 FORTRAN 读取相同的代码。这可能是我的编译行,此时我不确定我的代码的哪一部分被破坏了。下面是我的 FORTRAN 代码

c codeF.f

      program main
      include 'code.h'
      print *, 'Calling C'
      call worker()
      print *, 'Back to F77'

      end program main

我的编译脚本

gfortran -I/Path/to/file -c codeF.f

'code.h' 标头出现大约 8 个错误。虽然我的 c++ 代码可以读取标题 FORTRAN 不能。到目前为止,我所有的互联网研究都将我带到了这里,希望有经验的人可以帮助我。

谢谢

【问题讨论】:

  • 从你的 c/c++ 代码创建一个库。并且不要将实现包含在标题中 (#include &lt;code.cpp&gt;)。然后将 fortran 程序与库链接。
  • #include "code.cpp" 逆风闻到 5 英里。
  • 您不能将 C++ 和 Fortran 组合在一个文件中。这就是“包含'code.h'”的作用。您需要将 C++ 和 Fortran 部分完全分开!
  • @BitTickler 没必要,编译gfortran cpp_part.cc fpart.f90 -lstdc++即可。

标签: c++ fortran gfortran


【解决方案1】:

您不能在 Fortran 中包含 C++ 标头。您必须创建一个 接口块 来描述该过程,以便 Fortran 可以调用它:

  program main

    interface
      subroutine worker() bind(C,name="worker")
      end subroutine
    end interface

    print *, 'Calling C'
    call worker()
    print *, 'Back to F2003'

  end program main

您可能仍然有问题,不建议将 Fortran 和 C++ I/O(std:cout 流和 print 语句)组合在一个可执行文件中。它们不能保证兼容,并且可能会发生奇怪的事情。

忘记 FORTRAN 77,它已经 40 岁了,比这里的很多人(包括我)都多。考虑到计算机和程序的发展速度,即使是 Fortran 90 也太旧了。最新标准是 Fortran 2008,而 Fortran 2015 作为草案存在。

有关将 C 和 C++ 与 Fortran 接口的更多信息,请参阅 中的问题和答案。

【讨论】:

  • 我会尝试一下,使用 FORTRAN 77 的原因是因为一个名为 MFIX 的旧软件(用于 CFD 等用途)主要是用 77 编写的。我不知道FORTRAN 足够好,可以考虑使用 f90。感谢您的建议。
  • 玩了一会儿后,我仍然无法让它工作。但是我找到了一个解决方案,即我可以将现有的库调用到似乎对我有用的 FORTRAN 中。这意味着我不再需要创建自己的库和标题,并且希望不必回到这个问题。感谢您的回复
猜你喜欢
  • 2022-01-22
  • 2011-02-22
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多