移动一个编译好的Haskell程序

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

据推测,当我安装GHC时,软件包pipe理器也安装了所有的库和它需要的东西。 [我注意到有些恼怒,至less有一个包装系统不能安装GCC,GHC显然不能没有…]但是当然,目标系统没有安装这些依赖关系。 所以,如果我将编译的二进制文件复制到目标系统,它只是无法运行。

有没有办法解决这个问题? 我习惯于使用Windows,如果你编译了一些东西,它只能在所有的Windows系统上运行。 (至less,直到你真的尝试使用非标准的设施,如数据库访问或其他…)我在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位可执行文件应该在大多数情况下工作,但是…好吧,这取决于目标机器的配置,所以检查是不是这样的情况。