我想在一个Linux机器上编译一个Haskell程序,然后在另一个Linux机器上运行它.但是,这似乎根本不起作用.我收到有关缺少库的错误.
据推测,当我安装GHC时,包管理器还会安装所需的所有库和内容.[我有些恼怒地注意到至少有一个包装系统无法安装GCC,如果没有GHC,GHC显然无法运行......]但是当然,目标系统没有安装这些依赖项.因此,如果我将已编译的二进制文件复制到目标系统,它就无法运行.
有什么方法可以解决这个问题吗?我习惯使用Windows,如果你编译一些东西,它只适用于所有Windows系统.(至少,直到你真正尝试使用非标准设施,如数据库访问或其他东西......)我在Haskell中编译了Hello World,将其复制到另一个Linux盒子,并抱怨libgmp.so.10缺失或像那样神秘的mumbo-jumbo.
只是为了让事情变得有趣:我只有FTP访问目标机器,而不是shell访问.我甚至不完全确定它正在运行什么操作系统.所以我可以以任何我想要的方式更改我的构建机器,但除了将文件复制到目标机器之外,我无法对目标机器做任何事情.
在这方面,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 "$@"
Run Code Online (Sandbox Code Playgroud)
保存此脚本并将其标记为可执行文件chmod +x myscript将使您的可执行文件正常工作.
您可以使用该ldd命令检查可执行文件可能需要的哪些库以及目标系统上不存在的库.
| 归档时间: |
|
| 查看次数: |
1219 次 |
| 最近记录: |