一尘不染

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

linux

我爱得如此之多的两件事通常并不会引起我那么多的烦恼(除了我的孩子们)。我已经在工作中编写了一个Haskell程序,该程序使用诸如文本,xml-
enumerator,attoparsec-text等库。我在Windows计算机,Ubuntu虚拟机(32位),
Ubuntu桌面(再次为32位)和运行Ubuntu(64位)的EC2实例。

我们的客户端正在运行64位CentOS 5.3。我无法终生使此可执行文件正常运行。我尝试使用以下方法创建静态可执行文件:

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中安装该程序的所有依赖项。如果人们有经验并且知道text / attoparsec / etc在jhc中可以工作,我很想听听。
  • 破解所有黑客程序:构建Windows可执行文件,在其服务器上安装wine并以这种方式运行。

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


阅读 393

收藏
2020-06-07

共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团队会认为这是当务之急。

2020-06-07