基于Ubuntu 11.10构建的Haskell程序在Ubuntu 10.04上无法运行。

4
我正试图为我的程序用户提供一些 Linux 二进制文件,除了当前的 Windows 版本,所以我安装了 Ubuntu 11.10(因为在 11.04 上的 haskell-platform 软件包仍然是 2010 年的版本)。但是当我尝试在 Ubuntu 10.04 上运行生成的二进制文件时,却出现了无法找到 libgmp.so.10 的错误消息。检查 /usr/lib 发现 10.04 自带的是 libgmp.so.3,而 11.10 则是 libgmp.so.10。因此看来 GHC 动态链接到了 libgmp,而不是静态链接,我原以为这是默认设置。

有没有办法告诉 GHC 在二进制文件中静态包含 libgmp?如果没有,是否有其他解决方案,不需要用户安装不同版本的 libgmp?


除非我弄错了,否则“libgmp”默认动态链接的原因是,静态链接会强制你在 GPL 许可下分发生成的可执行文件。 - hammar
最好编写一个软件包,让每个软件包为每个不同的架构构建,而不是静态链接gmp。 - alternative
3个回答

2
原来,在编译时使用静态链接二进制文件时,仅使用-static标志是不够的。相反,请使用以下命令:
ghc -static -optl-static -optl-pthread --make yourfile.hs

使用此方法,我的二进制文件能够在Ubuntu的两个版本上正确运行。


我正在尝试将我的Web应用程序部署到Heroku Cedar堆栈。Cedar使用Ubuntu 11.04,而我使用11.10。因此,基本上我遇到了相同的错误。但是我尝试了你的解决方案,它引发了一个新的错误:“mkTextEncoding:无效的参数(无效的参数)”。你能帮我解决这个问题吗? - Abdulsattar Mohammed

1
通常,旧的libgmp软件包也是可用的;也就是说,让您的程序依赖于libgmp3c2软件包,而不是通用的libgmp或libgmp10。这通常可以通过使用较早版本的GHC或gmp库进行编译来实现(例如,安装libgmp3-dev而不是libgmp10-dev)。

但是这样不会动态链接到libgmp3吗,这意味着它不能在Ubuntu 11.10和可能的其他Linux发行版上运行?您还提到了通用的libgmp。有没有办法让二进制文件使用遇到的任何版本的libgmp? - FalconNL
我所说的通用libgmp是指通用包,它会自动提供当前版本的libgmp。你不能通用地链接你的程序,因为新的主版本号意味着在从libgmp3到libgmp10的过渡中删除了功能。你的程序也可以在Ubuntu 11.10上运行,因为Ubuntu 11.10仍然有libgmp3可用(多个主要版本可以并行安装)。总结一下:如果-static对你来说足够好,那就没问题,如果你选择-dynamic,请使用最旧的合理库。 - thiton
请确保您的 .deb 文件在其控制文件中指定了对所需动态库版本的依赖关系。 - tripleee

1
你可以使用 ghc 选项 -static 来静态链接库。

啊,所以在Linux上你需要明确地启用这个吗?我一直以为GHC默认总是静态编译的。我回家后会试试这个。 - FalconNL
好的,我尝试使用-static编译,但不幸的是我仍然收到相同的错误消息。你有什么想法我做错了什么吗? - FalconNL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接