为什么某些外来函数静态链接而其他函数动态链接?

时间:2018-03-25 02:34:10

标签: haskell libgit2

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

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

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

那么为什么某些功能会动态链接而其他功能静态链接?我怎么能改变这个?

我的.cabal文件中的相关设置是

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

0 个答案:

没有答案