Если друг хочет запустить мои двоичные файлы Haskell, он должен сначала установить Haskell, или он может сразу запустить двоичный файл?
Является ли ответ одинаковым на Mac, Windows и Linux?
Если друг хочет запустить мои двоичные файлы Haskell, он должен сначала установить Haskell, или он может сразу запустить двоичный файл?
Является ли ответ одинаковым на Mac, Windows и Linux?
GHC создает автономные двоичные файлы, для которых не требуется установка GHC, однако они связаны с некоторыми динамическими библиотеками, особенно с libgmp
. Оставшиеся библиотеки обычно встречаются в коробке на большинстве Linux-систем. Я считаю, что ситуация похожа на Windows.
Вы можете проверить, какие динамические библиотеки зависят от использования ldd
в Linux. Вот что я получаю от Ubuntu Natty для простой программы Hello World:
$ echo 'main = putStrLn "Hello World"' > Hello.hs
$ ghc --make Hello.hs
[1 of 1] Compiling Main ( Hello.hs, Hello.o )
Linking Hello ...
$ ldd Hello
linux-vdso.so.1 => (0x00007fffe45ff000)
libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007f8874cf9000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8874a74000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f887486b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8874667000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88742d3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f88740b4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8874f7a000)
GHC компилирует Haskell в объектный код со связанным временем выполнения. Это означает, что вам не нужен компилятор Haskell для выполнения программ Haskell.
Сгенерированный исполняемый файл будет использовать некоторый вариант статического и динамического связывания для зависимостей библиотеки C и Haskell. Все, что статически связано, не нужно устанавливать на пользовательскую машину. Все, что динамически связано, должно быть установлено.
Чтобы узнать, что вам нужно отправить вместе с исполняемым файлом, на Linux (или Cygwin) используйте ldd
. Вы можете заставить статическое соединение почти всего, передав -static
в GHC.
Если желательно статически связать некоторые библиотеки C с исполняемым файлом Haskell, в Linux вы можете использовать --whole-archive
с помощью GNU-компоновщика; например:
ghc --make HelloZ.hs \
-optl-Wl,--whole-archive \
-optl/usr/lib/x86_64-linux-gnu/libffi.a \
-optl/usr/lib/x86_64-linux-gnu/libz.a \
-optl-Wl,--no-whole-archive
Пока они довольно распространены, libffi
и libz
не являются повсеместными (libffi
- это тот, который я часто вижу в своих двоичных файлах Haskell).
Этот подход был впервые предложен мне совсем недавно, на haskell-cafe.
Для большинства двоичных файлов установка GHC не требуется. Некоторые (например, xmonad) используют Haskell в качестве языка их настройки; в этих случаях вам понадобится компилятор.
Существует также вопрос о статической и динамической компоновке. Я считаю, что по умолчанию на данный момент по-прежнему остается статическая привязка, и в этом случае довольно легко перенести двоичный файл с одного компьютера на другой (просто нужно иметь одну и ту же архитектуру и ОС).