5

我正在使用的源代码最初是为英特尔 Fortran 编译器编写的,因此它具有预处理器指令,例如
!DEC$ATTRIBUTES DLLEXPORT::MYDLL
!DEC$ATTRIBUTES STDCALL::MYSUBROUTINE
!DEC$ATTRIBUTES ALIAS: 'MYENTRYPOINT'::MYSUBROUTINE

如何将其转换为与 gfortran 一起使用。主要是我希望能够定义和命名入口点。现在,当我使用 gfortran 编译时,每个子例程都会作为入口点公开。此外,入口点名称都是小写字母,末尾带有下划线。

4

2 回答 2

6

如果将例程放入模块中并将语句PRIVATE放在模块顶部,则PUBLIC :: name1, name2,只有过程name1name2在模块外可见。这应该遵循一个库,您可以在其中放置包含模块的目标代码。从 Fortran 90 开始就支持这一点。

正如@janneb 已经回答的那样,您可以使用bind (C,name=X)方法来完全控制过程的外部可见名称,覆盖过程的 Fortran 名称。这是 Fortran 2003 的一部分,多年来受到众多编译器的支持。bind(C) 方法的一个可能问题是它指定例程的调用约定应该是 C 的调用约定。如果这与 Fortran 不同,并且您希望从 Fortran 调用这些例程,则复杂性会增加。然后,您必须指定一个接口来通知调用 Fortran 例程它们正在调用看起来像 C 例程的东西。由于人们很少关心链接器可见的名称,除非他们从 C 调用,您可能想要 C 调用约定?

Fortran和C/C++、FORTRAN、下划线和 GNU Autotools中的私有函数示例

于 2012-01-04T16:43:19.093 回答