创build一个静态的Haskell Linux可执行文件

我常常不喜欢两件事情,一起引起我很多烦恼(除了我的孩子)。 我在工作中使用了一个Haskell程序,它使用像text,xml-enumerator,attoparsec-text等库。我可以正常工作在我的Windows机器上,我的Ubuntu虚拟机在工作(32位),我的Ubuntu桌面(再次32位)和运行Ubuntu(64位)的EC2实例。

我们的客户正在运行CentOS 5.3,64位。 我不能为我的生活得到这个可执行文件正常运行。 我试图创build一个静态的可执行文件,

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

但是当我尝试在CentOS服务器上运行该可执行文件时,我收到一条错误消息:

 openFile: invalid argument (Invalid argument) 

我假设这与这里描述的错误有关。 我试过编译32位和64位Ubuntu,尝试静态和共享的构build,没有任何工作(虽然我偶尔会得到segfaults而不是上述错误信息)。 我可以尝试下载CentOS 5.3并为它创build一个虚拟机,但下载需要一段时间,我不确定哪个版本的GHC可以工作(我尝试在服务器上获得GHC 7,但是我跑了到一个libc的问题)。

在这一点上,我提出了一些可能的方法,但是我想尽可能地避免这些方法:

  • 用不同的语言重写(在Java中这样做的想法使我感到不安,虽然它可能是尝试Cal / OpenQuark的好时机)。
  • 也许尝试一个替代编译器,如jhc。 但是我不太确定如何开始在jhc中安装这个程序的所有依赖项。 如果有经验,并且知道文本/ attoparsec / etc在jhc中工作,我很乐意听到。
  • 所有黑客攻击:build立一个Windows可执行文件,在他们的服务器上安装wine并以这种方式运行。

总而言之,在这些情况下,我真的希望我们有一个用于GHC的JVM后端。 我想我也可以试用LambdaVM。 但我很想听听社区的build议,在这里做什么。

这个简单的例子“适合我”:

 $ 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团队会认为这是高优先级。

它与CentOS中的旧glibc库有关。 您必须使用与CentOS上安装的相同版本的glibc进行编译。

我有完全一样的问题。 在arch(或ubuntu)上编译的Haskell可执行文件不能在CentOS上运行。 在我的情况下,虽然我很幸运,因为我们的管理员只是删除了CentOS并安装了Arch应用服务器。

我发现了这个问题。 看来Biohaskell页面的链接是准确的:这是加载iconv的问题。 这发生在调用openFile ,而不是调用openBinaryFile 。 由于xml-enumerator使用后者,它工作得很好。 改用其余的代码来使用openBinaryFile来代替(通过Data.Enumerator.Binary.enumFile )让所有东西都起作用。

这对我的用例来说是一个很好的解决方法,但是这个错误依然存在。