分发您的程序#
在分发程序时,您可以选择多种选项
分发整个源代码
分发预构建的可执行程序
分发其他人可以使用静态或动态库
选项 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
优点是编译器可以检查传递的函数的接口,并且用户在使用您的库提供的功能方面具有更大的自由度。