c++ - 在 C/C++ 应用程序中使用 Fortran90 模块

标签 c++ c fortran fortran90 static-linking

我有一个用 fortran90 编写的大模块的源文件,其中包含一些类型定义、一些接口(interface)、一些函数和子例程。我能够编译它并在普通的 fortran 程序中使用它。

但由于我一直使用 C/C++ 并且我不太了解 fortran 我想在 C/C++程序。那就是使用它的数据类型并调用它们的函数/子例程。

这可能吗?我怎样才能做到这一点?我必须实现的各个步骤是什么?网络上是否有一些详尽的教程(我通过简短的谷歌搜索没有找到那么多......)

最佳答案

Fortran 2003 添加了与 C 的互操作性的具体规定。您可以找到 a run-down在 GCC 文档中。然而,如果您的 Fortran 代码不使用这些功能(实际上它可能不使用)并且您不准备修改它来这样做,那么答案在很大程度上取决于您的 Fortran 和 C 工具链。涉及的一些问题包括

  • 名称修改。许多 Fortran 编译器隐式地向声明的函数名称添加一个或多个下划线,并且大多数将标识符转换为全小写或全大写
  • 数组索引。 Fortran 数组索引从 1 开始(默认情况下),多维数组的索引顺序与 C 中使用的顺序相反。
  • 字符串参数。 Fortran 有明确长度的字符串。它们在函数参数列表中的表示方式因编译器而异。大多数使用 char * 并将长度作为单独的参数传递,但也采用了其他安排。此外,长度参数可以紧跟在指针之后,也可以附加在参数列表的末尾。
  • 一般是字符串。 Fortran 有明确长度的字符串。超出有效数据末尾的位置应留空。
  • 指点。 Fortran 95 没有原始指针。它确实有一个叫做指针的东西,但它并不直接类似于 C 指针。
  • 标量数据类型。从 C 数据类型(如 intdouble)到 Fortran 数据类型的映射在某种程度上取决于所涉及的编译器。不能保证一个编译器提供的所有类型在另一个编译器已知的类型中具有类似的类型。
  • 用户定义的类型。如果没有 C 互操作特性,即使您可以正确匹配组件的类型,也很难确保用户定义类型的布局相同。
  • 参数传递约定。除了 Fortran 使用引用调用这一事实之外,Fortran 90 还提供了不映射到 C 中任何内容的数组传递模式。并非所有函数都使用这些模式来传递数组,但您不太可能能够调用函数(它们甚至不受 F03 的 C 互操作功能支持)。
  • 不要将 Fortran 外部 I/O 与 C 外部 I/O 混合使用。很难做到正确。
  • 您可能需要链接 Fortran 运行时库。它的名称因编译器而异。

这不是一个详尽的列表,但它涵盖了大多数常见问题。您需要处理哪一个取决于您尝试连接的包。

在 F03 之前,Fortran/C 互操作通常是在逐个产品、特定于工具链的基础上提供的。通常在一侧或另一侧或两侧提供一组特定的接口(interface)功能。仍然有大量这样的代码,这对您来说可能也是一个很好的策略。此外,还有一些工具可以帮助解决困惑问题。 GNU Autotools 对它有一些支持,例如,涵盖的不仅仅是 GNU 工具链。或者,您可能需要检查一些目标文件以确定如何解决其中的一些问题。

关于c++ - 在 C/C++ 应用程序中使用 Fortran90 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27153706/

相关文章:

c - 如何解决c中 "byte swapping operation"引入的污染标量覆盖问题

c - 何时使用 fcheck() 或 fcheck_files() 以及为了什么?

linux - forrtl : severe (174): SIGSEGV, 发生段错误

c - 如何使用 128 位 C 变量和 xmm 128 位 asm?

c++ - 为非静态成员函数创建一个 unary_function 仿函数

c++ - 重用时 AVAssetWriter 失败并显示 AVAssetWriterStatusFailed

C++:验证 Windows 应用程序是否打开?

linux - cmake 在 Linux 上复制 Fortran 模块失败

arrays - 声明数组的不同语法 : with and without the dimension statement

c++ - 双星阵