分发您的程序#

在分发程序时,您可以选择多种选项

  1. 分发整个源代码

  2. 分发预构建的可执行程序

  3. 分发其他人可以使用静态或动态库

选项 1:分发整个源代码

对于您作为程序员来说,这无疑是最简单的:您将其留给用户在他们自己的机器上构建。不幸的是,这意味着您必须拥有一个用户友好的构建系统,并且用户必须能够访问合适的编译器。有关构建系统:请参阅上一节。

选项 2:分发预构建的可执行程序

除了通过其输入之外不需要自定义的预构建程序,仍然需要附带各种运行时库,并且特定于其构建的操作系统/环境。

运行时库的集合因操作系统和编译器版本而异。对于像 gfortran 这样的免费编译器,最简单的方法是要求用户在他们的系统上安装该编译器。在 Windows 的情况下:可能需要调用 Cygwin 环境。

或者,您可以将运行时库的副本与您的程序一起提供。将它们放在运行时可以找到它们的目录中。

注意:在 Windows 上,Intel Fortran 带有一组可再发行库。这些将需要提供。

一般来说:使用像“ldd”或“dependency walker”这样的工具来找出需要哪些库,并查阅编译器的文档。

如果您的程序确实允许自定义,请考虑为此使用动态库。下面将对此进行更多说明。

选项 3:分发其他人可以使用静态或动态库

此选项是前两个选项的组合。它确实给用户带来了一些负担,因为他们必须创建一个以正确方式调用您例程的主程序,但他们不需要了解您使用的构建系统。但是,您将必须处理运行时库。

如果您选择此选项,除了编译后的库之外,您还需要提供模块中间文件。这些文件是特定于编译器的,但您构建的静态库也是如此。

分发制表程序#

如上所示,制表程序可以使用动态库中的用户定义函数构建。这使您能够

  • 交付可执行文件(以及相应的运行时库)

  • 提供模块的基本版本,例如

module user_functions
    implicit none
contains

real function f( x )
!DEC$ ATTRIBUTES DLLEXPORT :: f
    real, intent(in) :: x

    ! your function body goes here

end function f

end module user_functions
  • 提供一个带有如下命令的基本构建脚本

gfortran -o functions.dll functions.f90 -shared

ifort -exe:functions.dll functions.f90 -dll

如前所述,您无法控制用户是否已正确执行操作——任何带有函数f 的 DLL“functions.dll”都将被接受,但不一定会导致成功运行。

另一种设置方法是将主程序更改为子程序,并将函数作为参数

module tabulation
    implicit none
contains

subroutine tabulate( f )
    interface
        real function f( x )
            real, intent(in) :: x
        end function f
    end interface

    ! your implementation goes here

end subroutine tabulate

end module tabulation

然后提供一个基本的程序骨架

program tabulate_f
    use tabulation

    call tabulate( func1 )

contains

real function func1( x )
    real, intent(in) :: x

    ! your function body goes here

end function func1

end program tabulate_f

优点是编译器可以检查传递的函数的接口,并且用户在使用您的库提供的功能方面具有更大的自由度。