移动一个编译好的Haskell程序

我想在一个Linux机器上编译一个Haskell程序,然后在另一个Linux机器上运行它。 但是,这似乎并不奏效。 我收到关于缺少库的错误。

据推测,当我安装GHC时,软件包管理器还会安装它需要的所有库和东西。 [我有些恼火地注意到至少有一个包装系统无法安装GCC,GHC显然无法在没有...的情况下运行]但是当然,目标系统没有安装这些依赖项。 所以,如果我将编译的二进制文件复制到目标系统,它只是无法运行。

有没有解决这个问题的方法? 我习惯于使用Windows,如果你编译了一些东西,它就可以在所有的Windows系统上运行。 (至少,直到你真的试图使用非标准设施,如数据库访问或其他...)我在Haskell中编译Hello World,将它复制到另一个Linux机器,并且抱怨libgmp.so.10丢失或一些神秘的巨无霸。

只是为了让事情变得有趣:我只能通过FTP访问目标机器,而不是shell访问。 我甚至不完全确定它运行的是什么操作系统。 因此,我可以按我想要的方式更改构建机器,但除了将文件复制到目标机器外,我无法对目标机器执行任何操作。


在这方面,Linux的行为就像Windows一样。 如果您在Linux上编译Haskell可执行文件,它将在任何具有正确库的Linux发行版上运行。 问题是,在Windows中,Haskell可执行文件不会编译为动态版本的libgmp; 它们是用一个静态版本编译的(所以这个库被编译到可执行文件中),这正是因为在分发可执行文件时处理Windows上的dll是非常困难的。 在Linux上处理新库的安装相当容易。

你可以做的是将libgmp.so.10(可能是一个不同文件的符号链接)复制到/ usr / lib目录下作为你的可执行文件。 然后,可以在启动可执行文件之前将LD_LIBRARY_PATH环境变量设置为“。”,即当前目录。 这将使Linux在与它启动的可执行文件相同的目录中查找库,使其找到库。 这可以通过启动脚本完成:

#!/bin/sh
export LD_LIBRARY_PATH=.
`dirname "$0"`/myexecutable "$@"

使用chmod +x myscript保存此脚本并将其标记为可执行文件将使您的可执行文件可以工作。

您可以使用ldd命令来检查您的可执行文件可能需要并且不在目标系统上的其他库。


如果您希望在计算机之间移动可执行文件,则必须静态链接,使得单个可执行文件无需外部库依赖关系。 如何做到这一点取决于编译器,而且ghc具有静态标志,即'链接静态版本的haskell库'。

顺便说一句,检查,你不要试图在32位机器上运行64位可执行文件。 大多数情况下,64位机器上的32位可执行文件应该可以正常工作,但是......它取决于目标机器的配置,因此请检查确实不是这种情况。

链接地址: http://www.djcxy.com/p/43393.html

上一篇: Moving a compiled Haskell program

下一篇: GHC Core as "bytecode"?