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

标签 linux haskell libraries static-linking ld

让我如此烦恼的两件事(除了我的 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/

相关文章:

c++ - 与 Windows 相比,将数组写入文件的相同代码在 Linux 上少写了 1 行

linux - gdb 调试剥离的可执行文件

haskell - 可以在不使用可变变量的情况下对其进行编码吗?

Haskell 无可辩驳的模式匹配

android - 如何将 torrent 下载集成到 Android 应用程序中?

android - Gradle构建顺序

Linux 中的 C++ 创建 2 个文件

linux - 是否可以在不停止被跟踪者的情况下读取线程的指令指针?

haskell - 高阶列表和类型族的歧义错误

xcode - 使用命令行向 Xcode 项目添加库/框架?