Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell GHC静态链接动态库_Haskell_Linker_Ghc_Static Linking_Dynamic Linking - Fatal编程技术网

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的固定版本以及每个项目的所有库(并将它们存储在项目目录中的隐藏文件夹中),因此如果设置正确,整个过程将是静

在Arch Linux上,默认情况下,已安装的Haskell库是动态链接的。 因此,要在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设置。我很好奇是否有可能使用裸骨工具。您可能想看看。所有这些方法只能通过以静态格式重新下载和构建所有依赖项来工作——请参阅我的另一个答案。