移动已编译的Haskell程序

时间:2012-07-19 18:51:15

标签: linux haskell ghc

我想在一个Linux机器上编译一个Haskell程序,然后在另一个Linux机器上运行它。但是,这似乎根本不起作用。我收到有关遗失图书馆的错误。

据推测,当我安装GHC时,软件包管理器还会安装所需的所有库和内容。 [我有些恼怒地注意到至少有一个包装系统无法安装GCC,如果没有GHC,GHC显然无法运行...]但是当然,目标系统没有安装这些依赖项。因此,如果我将已编译的二进制文件复制到目标系统,它就无法运行。

有没有解决这个问题的方法?我习惯使用Windows,如果你编译一些东西,它只是在所有Windows系统上工作。 (至少,直到你真正尝试使用非标准设施,如数据库访问或其他东西......)我在Haskell中编译了Hello World,将其复制到另一个Linux盒子,并抱怨libgmp.so.10缺失或像这样的一些神秘的mumbo-jumbo。

只是为了让事情变得有趣:我只有FTP访问目标机器,而不是shell访问。我甚至不完全确定它正在运行什么操作系统。所以我可以按照我想要的方式更改我的 build 机器,但除了将文件复制到目标之外,我无法做任何事情。

2 个答案:

答案 0 :(得分:9)

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

您可以做的是将/ usr / lib中的libgmp.so.10(可能是指向不同文件的符号链接)复制到与可执行文件相同的目录中。然后,可以在启动可执行文件之前将LD_LIBRARY_PATH环境变量设置为“。”,表示当前目录。这将使Linux在与其启动的可执行文件相同的目录中查找库,从而使其找到库。这可以使用启动器脚本完成:

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

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

您可以使用ldd命令检查您的可执行文件可能需要的哪些库以及目标系统上没有的库。

答案 1 :(得分:1)

如果您希望在计算机之间移动可执行文件,则必须静态链接,使单个可执行文件没有外部库依赖项。怎么做取决于编译器,ghc有-static标志,'链接haskell库的静态版本'。

不过,请检查一下,您不要尝试在32位计算机上运行64位可执行文件。在大多数情况下,64位机器上的32位可执行文件应该可以工作,但是......好吧,这取决于目标盒的配置,所以检查一下情况并非如此。