GHC 静态链接动态库

4
在Arch Linux上,默认情况下安装的Haskell库是动态链接的。因此,要使任何东西在ghc上编译,我必须使用-dynamic标志,否则它甚至无法发现这些库。
然而,我想产生可以分发到其他系统的静态链接二进制文件。是否有办法使用ghc从动态/共享库生成静态链接二进制文件?
我尝试了这个相关帖子中的-optl-static,但那导致了无数的“未定义引用”错误。

cabal v2-build 不是默认使用静态链接吗? - arrowd
似乎这个问题与 GHC/Haskell 没有直接关系 - 问题在于如何静态链接一个动态库?我的默认答案是这不可能。一种解决方案是将 dylibs 嵌入可执行文件中,使用类似 Linux 上的 AppImage 或者 Windows 上的 windres 等工具,但我不知道你怎么告诉 cabal / 链接器在那里找到它们。 - Ari Fordsham
2个回答

1

动态链接库编译时缺失静态链接所需的信息(反之亦然)。详见:

这是操作系统链接器设计固有的特性,不属于cabal或GHC的限制。例如,在C语言中也无法简单地实现此功能。

为了实现单文件可重新分发的二进制文件,您可以尝试将动态库打包到可执行文件中,使用像Linux上的AppImage这样的格式,或者使用Windows上的windres资源方案,但您必须手动设置代码和cabal以在正确位置找到库。


0
如果您使用The Stack build system,它将自动下载和管理每个项目的固定版本的GHC和所有库(并将它们存储在项目目录中的隐藏文件夹中),因此,如果您正确设置了它,整个系统都将是静态的。目前Stack对静态支持不是很好,但可以使其正常工作。一些资源:

整个想法是不依赖于其他构建系统。在这种情况下,我会使用Nix,因为我已经安装了它^^ - xeruf
你可能可以使用cabal sandboxes并设置正确的GHC选项来做类似的事情。我很好奇为什么你坚持使用cabal - 你可以使用stack init(或使用cabal2nix转换为nix)将现有的cabal项目转换为stack。 - Ari Fordsham
因为我已经有了一个可用的Nix设置。我很好奇是否有可能使用基本的工具进行工作。 - xeruf
你可能想要查看cabal sandboxes。所有这些方法都只能通过以静态格式重新下载和构建所有依赖项来实现 - 请参见我的其他答案。 - Ari Fordsham

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