如何在d

时间:2015-06-01 02:00:00

标签: d libgit2

我正在尝试使用d中的libgit2库。我总是在程序的退出时遇到分段错误。当我打开和关闭存储库时,错误不会在退出之前发生。这似乎是垃圾收集器的一个问题,但手动禁用垃圾收集器(GC.disable();)似乎根本不会影响结果。释放(git_repository_free(repo))似乎也没有效果。

这个代码示例:

import std.stdio : writeln;
import std.string : toStringz;

import core.memory : GC;

import deimos.git2.types : git_repository;
import deimos.git2.repository : git_repository_open, git_repository_free;

void main() {
    GC.disable();
    git_repository *repo;
    git_repository_open(&repo, ".".toStringz());
    git_repository_free(repo);
    writeln("END");
}

输出:

$ ./gittest
END
zsh: segmentation fault (core dumped)  ./gittest

版本:

  • libgit2-dev:0.22.1-0ubuntu3
  • libgit2:〜> 0.20.1
  • 配音:0.9.23-0
  • dmd-bin:2.067.1-0
  • kubuntu:15.04

如果有的话,我做错了什么?如果没有什么可以识别错误的罪魁祸首(d,libgit2,或libgit2 d绑定)?

补充说明:我尝试使用dlibgit并发现它非常有缺陷,主要是看起来过时了。这个问题涉及libgit2 d绑定。

1 个答案:

答案 0 :(得分:4)

从我的评论中推广:

libgit2 0.22.1需要在调用任何其他libgit2函数之前调用git_libgit2_init。由于D绑定是针对0.20.1的,因此它们不提供对此函数的绑定。

您可以通过以下方式破解与init / shutdown函数的绑定:

extern (C):
int git_libgit2_init();
int git_libgit2_shutdown();