让我如此烦恼的两件事(除了我的 child )并不常见。我在工作中编写了一个 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
但是当我尝试在 CentOS 服务器上运行该可执行文件时,我收到一条错误消息:
openFile: invalid argument (Invalid argument)
我假设这与 the bug described here 有关.我试过从 32 位和 64 位 Ubuntu 进行编译,尝试过静态和共享构建,但没有任何效果(尽管我偶尔会收到段错误而不是上述错误消息)。我可以尝试下载 CentOS 5.3 并为其创建一个虚拟机,但下载需要一段时间,而且我不确定哪个版本的 GHC 可以在它上面运行(我尝试在他们的服务器上安装 GHC 7,但我跑了变成一个 libc 问题)。
在这一点上,我想出了一些可能的方法,但我想尽可能避免这些方法:
- 用不同的语言重写(想到用 Java 做这件事让我感到不安,尽管现在可能是试用 Cal/OpenQuark 的好时机)。
- 或许可以试试其他编译器,比如 jhc。但是我不太确定如何开始在 jhc 中安装该程序的所有依赖项;如果人们有经验并且知道 text/attoparsec/etc 在 jhc 中工作,我很想听听。
- Hack of all hacks:构建一个 Windows 可执行文件,在他们的服务器上安装 wine 并以这种方式运行它。
总的来说,在这些情况下,我真的希望我们有一个用于 GHC 的 JVM 后端。我想我也可以试试 LambdaVM。但我很想听听社区关于在这里做什么的建议。
最佳答案
这个简单的例子“对我有用”:
$ 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 团队会优先考虑这一点。
关于linux - 创建一个静态的 Haskell Linux 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953199/