我很少遇到两个我非常喜欢的事情结合在一起给我带来这么多困扰(除了我的孩子)。我在工作中编写了一个使用类似text、xml-enumerator、attoparsec-text等库的Haskell程序。我已经在我工作的Windows机器上,我的Ubuntu虚拟机上(32位),我的Ubuntu桌面上(再次是32位)以及运行Ubuntu(64位)的EC2实例上使它正常工作。
我们的客户正在运行CentOS 5.3,64位。 我无论如何都不能让这个可执行文件正常运行。我尝试使用以下命令创建静态可执行文件:
ghc --make myprog.hs -optl-static -optl-pthread
但是当我尝试在CentOS服务器上运行该可执行文件时,出现错误信息:
openFile: invalid argument (Invalid argument)
我猜这与这里描述的错误有关。我尝试编译32位和64位Ubuntu,尝试静态和共享构建,但无济于事(虽然偶尔会出现段错误而不是上述错误消息)。我可以尝试下载CentOS 5.3并为其创建虚拟机,但需要一些时间才能下载,而且我不确定哪个版本的GHC适用于它(我尝试在他们的服务器上获取GHC 7,但遇到了libc问题)。
目前,我想到了一些可能的方法,但如果有可能的话,我想避免使用它们:
- 以其他语言重写(尝试用Java做这件事让我感到不舒服,虽然可以尝试Cal / OpenQuark)。
- 尝试使用其他编译器,例如jhc。但是,我不太确定如何开始安装jhc中此程序所需的所有依赖项;如果有人有经验,并知道text / attoparsec等在jhc中起作用,则很乐意听取建议。
- 最后的hack:构建Windows可执行文件,安装wine到他们的服务器上,然后以这种方式运行它。
完全离题的是,在这些情况下,我真的希望我们有一个GHC的JVM后端。我想我也可以尝试LambdaVM。但是,我很想听听社区对此该怎么做的建议。