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

Mic*_*man 24 linux haskell ld static-linking libraries

这通常不是我喜欢的两件事,因为这些事情让我非常恼火(除了我的孩子).我在工作中编写了一个Haskell程序,它使用文本,xml-enumerator,attoparsec-text等库.我在工作的Windows机器上正常工作,我的Ubuntu虚拟机在工作(32位),我的Ubuntu桌面(再次32位)和运行Ubuntu(64位)的EC2实例.

我们的客户端运行的是CentOS 5.3,64位.我不能为我的生活让这个可执行文件正常运行.我尝试使用以下方法创建静态可执

ghc --make myprog.hs -optl-static -optl-pthread
Run Code Online (Sandbox Code Playgroud)

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

openFile: invalid argument (Invalid argument)
Run Code Online (Sandbox Code Playgroud)

我假设这与此处描述的错误有关.我尝试从32位和64位Ubuntu编译,尝试静态和共享版本,没有任何作用(虽然我偶尔会得到段错误而不是上面的错误消息).我可以尝试下载CentOS 5.3并为它创建一个虚拟机,但下载需要一段时间,而且我不确定哪个版本的GHC可以使用它(我尝试在他们的服务器上安装GHC 7,但我跑了进入libc问题).

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

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

总而言之,这些是我真的希望我们有GHC的JVM后端的情况.我想我也可以试用LambdaVM.但我很想听听社区对这里做什么的建议.

Don*_*art 30

这个简单的例子"适合我":

$ 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"
Run Code Online (Sandbox Code Playgroud)

(我在过去几年中通过.cabal使用此流程为客户提供可执行文件).

我认为最好的办法是提交错误,并使其正常运行.IHG也可以资助这样的工作,但我相当肯定GHC团队会认为这是一个高优先级,如果你正在尝试运送产品.


Vag*_*rdi 8

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

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


Mic*_*man 6

我发现了问题.似乎Biohaskell页面的链接是准确的:这是一个加载iconv的问题.这在调用时发生openFile,但在调用时不会发生openBinaryFile.由于xml-enumerator使用后者,它工作得很好.切换其余的代码来openBinaryFile代替(通过Data.Enumerator.Binary.enumFile)使一切工作.

对于我的用例,这是一个很好的解决方法,但错误仍然存​​在.