Haskell 为什么一些外部函数是静态链接的,而另一些是动态链接的?

Haskell 为什么一些外部函数是静态链接的,而另一些是动态链接的?,haskell,libgit2,Haskell,Libgit2,我正在开发一个需要操作git存储库的程序。我决定使用libgit2。不幸的是,它的haskell绑定已经过时好几年了,并且缺少我需要的几个函数。因此,我决定用C编写使用libgit2的部分,并通过FFI调用它们。出于演示目的,其中一个称为git_update_repo git_update_repo在纯C程序中使用时工作得非常好,但是当从haskell调用它时,断言失败,表明libgit2全局init函数git_libgit2_init尚未被调用。但是,git_libgit2_init由git_

我正在开发一个需要操作git存储库的程序。我决定使用libgit2。不幸的是,它的haskell绑定已经过时好几年了,并且缺少我需要的几个函数。因此,我决定用C编写使用libgit2的部分,并通过FFI调用它们。出于演示目的,其中一个称为git_update_repo

git_update_repo在纯C程序中使用时工作得非常好,但是当从haskell调用它时,断言失败,表明libgit2全局init函数git_libgit2_init尚未被调用。但是,git_libgit2_init由git_update_repo调用。如果我使用gdb,我可以看到git_libgit2_init确实被调用,并报告初始化已经成功

我用nm检查了可执行文件,发现了一些有趣的东西。在纯C可执行文件中,所有libgit2函数都是动态链接的(如预期的那样)。但是,在我的haskell可执行文件中,git_libgit2_init是动态链接的,而其余的libgit2函数是静态链接的。我确信这种不匹配是我的问题的原因

那么为什么某些函数是动态链接的,而其他函数是静态链接的呢?我怎样才能改变这个

my.cabal文件中的相关设置如下

  cc-options: -g
  c-sources:
      src/git-bindings.c
  extra-libraries:
      git2

备选方案:Try或最新版本的hlibgit2提供了到libgit2版本0.18.0的绑定,正如我在帖子中所说,该版本已经过时好几年了,并且缺少我需要的功能。是的,但上面说“有几个不同的后端可用。”也许有一个可以满足您的需要。您应该能够通过在ghc命令行中添加“-v”来获得实际的链接命令。这将非常有助于回答您的问题。您是否对libgit2有一些间接依赖?所以你依赖于另一个C库,哪个依赖于它?这可以解释不匹配的链接。