Распространение ваших программ#
Когда вы распространяете свои программы, существует несколько вариантов, из которых вы можете выбрать:
Распространение всего исходного кода
Распространение предварительно собранного исполняемого файла программы
Распространение статических или динамических библиотек, которые могут использовать люди
Вариант 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
Как уже было сказано, вы не можете проконтролировать, что пользователь сделал все правильно - любая DLL «functions.dll» с функцией f
будет принята, но не обязательно приведёт к успешному запуску программы.
Альтернативной настройкой может быть изменение основной программы на процедуру и использование функции в качестве аргумента:
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
Преимущество состоит в том, что компилятор может проверить интерфейс передаваемой функции, а пользователь имеет больше свободы в использовании функциональности, предоставляемой вашей библиотекой.