Haskell GHC静态链接动态库
在Arch Linux上,默认情况下,已安装的Haskell库是动态链接的。 因此,要在ghc中编译任何东西,我必须使用Haskell GHC静态链接动态库,haskell,linker,ghc,static-linking,dynamic-linking,Haskell,Linker,Ghc,Static Linking,Dynamic Linking,在Arch Linux上,默认情况下,已安装的Haskell库是动态链接的。 因此,要在ghc中编译任何东西,我必须使用-dynamic标志,否则它甚至无法发现库。 但是,我希望生成静态链接的二进制文件,以便分发到其他系统 有没有办法通过ghc从动态/共享库生成静态链接的二进制文件 我尝试了从中的-optl static,但这导致了无数“未定义的引用”错误。如果使用,它将自动下载和管理GHC的固定版本以及每个项目的所有库(并将它们存储在项目目录中的隐藏文件夹中),因此如果设置正确,整个过程将是静
-dynamic
标志,否则它甚至无法发现库。
但是,我希望生成静态链接的二进制文件,以便分发到其他系统
有没有办法通过ghc从动态/共享库生成静态链接的二进制文件
我尝试了从中的-optl static
,但这导致了无数“未定义的引用”错误。如果使用,它将自动下载和管理GHC的固定版本以及每个项目的所有库(并将它们存储在项目目录中的隐藏文件夹中),因此如果设置正确,整个过程将是静态的。Stack现在并没有惊人的静态支持,但它可以正常工作。一些资源:
- 为动态链接编译的库缺少静态链接所需的信息(反之亦然)。有关详细信息,请参阅:
cabal
或GHC的任何限制。例如,这也不能简单地用C来完成
要实现单文件可再发行二进制文件,您可以尝试将动态lib捆绑到可执行文件中,使用Linux上的格式或Windows上的
windres
资源方案,但是您必须手动设置代码和cabal
才能在正确的位置找到库。难道不是cabalv2build
默认为静态链接吗?这个问题似乎不是GHC/Haskell特有的-问题是,如何静态链接到动态库?我的默认答案是这是不可能的。一个解决方案是在可执行文件中嵌入DYLIB,在Linux上使用AppImage或在Windows上使用windres
,但我不知道如何告诉cabal
/链接器在那里找到它们。整个想法是不依赖于另一个构建系统。在这种情况下,我会使用nix,因为我已经安装了它^^你可能可以用阴谋集团的沙箱做类似的事情,并设置正确的GHC选项。。我很好奇为什么你坚持保留阴谋集团-你可以使用stack init
将现有阴谋集团项目转换为stack(或者使用cabal2nix
转换为nix),因为我已经有了一个工作的nix设置。我很好奇是否有可能使用裸骨工具。您可能想看看。所有这些方法只能通过以静态格式重新下载和构建所有依赖项来工作——请参阅我的另一个答案。