2015-06-01 19 views
1

我正在嘗試使用d中的libgit2庫。程序退出時,我總會遇到分段錯誤。在退出之前,當我打開和關閉存儲庫時,錯誤不會發生。看起來這是垃圾收集器的一個問題,但是手動禁用垃圾收集器(GC.disable();)似乎根本不會影響結果。釋放(git_repository_free(回購))似乎也沒有效果。如何在d中使用libgit的git_repository_open

這一些示例代碼:

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斌:2.067.1-0
  • 的Kubuntu:15.04

什麼,如果有的話,我哪裏做錯了?如果沒有發現錯誤的罪魁禍首(d,libgit2或libgit2 d綁定)?

附加說明:我嘗試使用dlibgit,發現它是令人難以置信的越野車,主要是過時似乎。這個問題涉及libgit2 d綁定。

+1

libgit2 0.22.1要求['git_libgit2_init']的呼叫(https://github.com/libgit2/libgit2#initialization )在任何其他libgit2函數被調用之前。由於D綁定爲0.20.1,因此它們不提供對此函數的綁定。這可能是問題。我會再挖掘一些。 – rcorre

+0

你是對的。這是問題。添加'extern(C): int git_libgit2_init(); int git_libgit2_shutdown();'和使用函數修復代碼。我將給你留下正式的答案。 –

回答

4

從我的評論推薦:

libgit2 0.22.1要求git_libgit2_init打電話叫其他任何libgit2功能之前。由於D綁定爲0.20.1,因此它們不提供對此函數的綁定。

可以在綁定到init /關閉功能與劈:

extern (C): 
int git_libgit2_init(); 
int git_libgit2_shutdown(); 
相關問題