Haskell Static vs Dynamic Linking в развертывании - PullRequest
6 голосов
/ 21 октября 2011

Почему cabal install не использует флаг --enable-shared по умолчанию? Я заметил, что тривиальные программы при компиляции без этого флага имеют огромный размер файла. Есть ли связь? Это выбор дизайна связан с тем, как программы на Haskell могут быть легко развернуты в одном автономном двоичном файле?

1 Ответ

4 голосов
/ 22 октября 2011

Я думаю, что это связано с отсутствием поддержки.Однако я не могу получить прямой ответ относительно того, поддерживает ли GHC в настоящее время динамическое связывание.Вики-странице GHC SharedLibraries / PlatformSupport исполнилось два года.

В Windows я попытался собрать целую кучу пакетов с --enable-shared, включая простую написанную мной программу, использующую http-enumerator для загрузки с URL каждые 30 секунд.Когда я запустил программу (после помещения всех библиотек DLL в папку с моей программой), через несколько секунд произошла ошибка.Когда я скомпилировал с --threaded, он сразу вышел из строя.

Я попробовал это в GHC 7.0.3.Страница документации для этой версии гласит:

В настоящее время преобразование библиотек Haskell в библиотеки DLL не работает в Windows;мы надеемся восстановить эту возможность в будущем (см. Раздел 4.12, «Использование общих библиотек»)....

Это уведомление не появляется в более поздних версиях.


Кстати, помимо размера кода, есть еще одна проблема со статическими двоичными файлами.GHC использует GMP для поддержки больших целых чисел.GMP лицензируется в соответствии с LGPL.Это означает, что если вам нужно распространять проприетарный двоичный файл или если у вас есть зависимость, которая не совместима с GPL (например, OpenSSL), вам нужно будет распространять ваши объектные файлы в соответствии с лицензией GMP.Либо так, либо найдите способ динамически связать libgmp.Я хотел бы знать, как это сделать.

...