如何在 d 中使用 libgit 的 git_repository_open
How to use libgit's git_repository_open in d
我正在尝试使用 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 绑定。
由我的评论提升:
libgit2 0.22.1 需要在调用任何其他 libgit2 函数之前调用 git_libgit2_init。由于 D 绑定适用于 0.20.1,因此它们不提供对此函数的绑定。
您可以破解 init/shutdown 函数的绑定:
extern (C):
int git_libgit2_init();
int git_libgit2_shutdown();
我正在尝试使用 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 绑定。
由我的评论提升:
libgit2 0.22.1 需要在调用任何其他 libgit2 函数之前调用 git_libgit2_init。由于 D 绑定适用于 0.20.1,因此它们不提供对此函数的绑定。
您可以破解 init/shutdown 函数的绑定:
extern (C):
int git_libgit2_init();
int git_libgit2_shutdown();