Требуются ли GHC-скомпилированные двоичные файлы GHC или они автономны? - PullRequest
44 голосов
/ 17 июня 2011

Если друг хочет запустить мои двоичные файлы на Haskell, должен ли он сначала установить Haskell или он может сразу запустить двоичный файл сам по себе?

Является ли ответ тем же на Mac, Windows и Linux?

Ответы [ 4 ]

43 голосов
/ 17 июня 2011

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)
23 голосов
/ 17 июня 2011

GHC компилирует Haskell в объектный код со связанной средой выполнения.Это означает, что вам не нужен установленный компилятор Haskell для выполнения программ на Haskell.

Сгенерированный исполняемый файл будет использовать некоторый вариант статического и динамического связывания для зависимостей библиотек C и Haskell.Все, что связано статически, не нужно устанавливать на компьютер пользователя.Все, что связано динамически, должно быть установлено.

Чтобы увидеть, что вам нужно отправить вместе с исполняемым файлом, в Linux (или Cygwin) используйте ldd.Вы можете принудительно установить статическое связывание практически всего, передав -static в GHC.

12 голосов
/ 24 сентября 2012

Если желательно статически связать некоторые библиотеки 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 .

5 голосов
/ 17 июня 2011

Установка GHC не требуется для большинства двоичных файлов.Некоторые (например, xmonad) используют Haskell в качестве языка конфигурации;в этих случаях вам понадобится компилятор.

Существует также вопрос статической и динамической компоновки.Я полагаю, что по умолчанию все еще статическое связывание, и в этом случае должно быть довольно легко перенести двоичный файл с одной машины на другую (просто нужно иметь ту же архитектуру и ОС).

...