10

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

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

有没有办法解决这个问题?我习惯于使用 Windows,如果您在其中编译某些东西,它只适用于所有 Windows 系统。(至少,直到你真正尝试使用非标准工具,如数据库访问或其他东西......)像这样的一些神秘的胡言乱语。

只是为了让事情变得有趣:我只有对目标机器的 FTP 访问权限,而不是 shell 访问权限。我什至不完全确定它运行的是什么操作系统。所以我可以随心所欲地更改我的构建机器,但除了将文件复制到目标机器之外,我无法对目标机器做任何事情。

4

2 回答 2

10

在这方面,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命令来检查您的可执行文件可能需要哪些其他库并且不在目标系统上。

于 2012-07-19T19:12:02.040 回答
0

If you wish to move executable between machines, you have to link in statically, making single executable without external library dependencies. How to do it depends on compiler, and ghc has -static flag, that 'links static version of haskell libraries'.

btw, check, that you do not try to run 64-bit executable on 32 bit machine. 32-bit executable on 64 bit machine should work in most cases, but... well, it depends on configuration of target box, so check that this is not the case as well.

于 2012-07-19T20:13:05.067 回答