Подтвердить что ты не робот

Создайте статический исполняемый файл Haskell Linux

Не так часто две вещи, которые я так люблю, объединяются, чтобы вызвать у меня столько раздражения (помимо моих детей). Я написал программу Haskell на работе, которая использует библиотеки, такие как text, xml-enumerator, attoparsec-text и т.д. Я работаю правильно на своей машине Windows на работе, моя виртуальная машина Ubuntu на работе (32-разрядная), моя Рабочий стол Ubuntu (снова 32-бит) и экземпляр EC2 с Ubuntu (64-разрядной версией).

Наш клиент работает CentOS 5.3, 64-бит. Я не могу на всю жизнь получить этот исполняемый файл для правильной работы. Я попытался создать статический исполняемый файл, используя:

ghc --make myprog.hs -optl-static -optl-pthread

Но когда я пытаюсь запустить этот исполняемый файл на сервере CentOS, появляется сообщение об ошибке:

openFile: invalid argument (Invalid argument)

Я предполагаю, что это связано с ошибка, описанная здесь. Я пробовал компиляцию из 32-битного и 64-битного Ubuntu, ставил статические и общие сборки, ничего не работает (хотя иногда я получаю segfaults вместо вышеупомянутого сообщения об ошибке). Я могу попробовать загрузить CentOS 5.3 и создать для нее виртуальную машину, но для ее загрузки потребуется некоторое время, и я не уверен, какая версия GHC будет работать над ней (я пытался получить GHC 7 на своем сервере, но я побежал в проблему с libc).

В этот момент я придумал несколько возможных подходов, но я хотел бы избежать их, если это вообще возможно:

  • Перепишите на другом языке (мысль о том, чтобы делать это в Java, делает меня тошнотворным, хотя было бы неплохо попробовать Cal/OpenQuark).
  • Возможно, попробуйте альтернативный компилятор, например jhc. Но я не совсем уверен, как начать установку всех зависимостей для этой программы в jhc; если люди имеют опыт и знают, что текст /attoparsec/etc работают в jhc, я бы хотел его услышать.
  • Взлом всех хаков: создайте исполняемый файл Windows, установите вино на свой сервер и запустите его таким образом.

В целом, это ситуации, когда я действительно хочу, чтобы у нас был JVM-сервер для GHC. Полагаю, я тоже мог попробовать LambdaVM. Но я хотел бы услышать советы сообщества о том, что делать здесь.

4b9b3361

Ответ 1

Этот простой пример "работает для меня":

$ cat A.hs
main = print "yes"

$ ghc -O2 --make -static -optc-static -optl-static A.hs -fvia-C -optl-pthread

$ ldd A
    not a dynamic executable
$ ./A
"yes"

(и я использовал этот процесс через .cabal для отправки исполняемых файлов для клиентов за последние пару лет).

Я считаю, что лучше всего зарегистрировать ошибки и заставить их работать. IHG также может финансировать работу, как это, но я уверен, что команда GHC считает это приоритетным, если вы пытаетесь отправить продукцию.

Ответ 2

Это связано со старой библиотекой glibc в CentOS. Вы должны скомпилировать ту же версию glibc, что и на CentOS.

У меня была точно такая же проблема. Исполняемый файл Haskell, скомпилированный на arch (или ubuntu), не будет работать в CentOS. В моем случае, хотя мне повезло, потому что наш администратор просто удалил CentOS и установил Arch для сервера приложений.

Ответ 3

Я выяснил эту проблему. Кажется, что ссылка на страницу Biohaskell является точной: это проблема загрузки iconv. Это происходит при вызове openFile, но не при вызове openBinaryFile. Так как xml-enumerator использует последнее, он работал отлично. Переключение остальной части кода на использование openBinaryFile вместо этого (через Data.Enumerator.Binary.enumFile) заставил все работать.

Это хороший способ для моего использования, но ошибка все еще существует.