2014-09-27 58 views
-1

我最近意識到可以通過爲該庫編寫一個綁定程序來使用爲另一種語言編寫的庫。 我遇到的問題是如何編寫活頁夾。 有人可以寫一個簡短的例子,將C庫(只有一個函數讓我能夠理解它)綁定到另一種語言嗎?瞭解庫綁定

非常感謝你

+0

http://www.swig.org/ – 2014-09-27 14:05:33

+0

謝謝,但我試圖學習如何做到這一點,而無需使用外部工具 – 2014-09-27 14:14:41

回答

3

這取決於語言及其實現。大多數語言實現文檔很好如何連接C函數對他們說:

注意,你應該如何接口取決於實現了很多。 Memory management應該是一個特別的問題:許多語言都有garbage collector,你應該尊重它的不變式。同樣,某些語言實現是多線程的,您應該遵守與線程相關的規則。一些實現需要一些特定的C接口來添加新的基元,而另一些則更加靈活。一些實現允許回調(即調用C語言函數的語言函數調用一些語言函數),但其他實現則不然。

還要注意相同語言的兩個不同的實施方式(例如CLISP和SBCL都是Common Lisp實現)具有不同的(並且通常不相容)接口到C的方法

由於Oliver Chalesworth評論,你可能會看看Swig裏面,這可能會爲你生成一些膠水代碼。

我的感覺是,最重要的是要理解語言使用的垃圾回收器的約束。您可能(或不需要)使用它的finalization工具(例如,文檔句柄或數據庫句柄是否通過在GC內部定稿或通過用戶調用的某個函數隱式關閉?)。您可能想要閱讀Garbage Collection Handbook以獲得不同GC技術的概述。

GTK庫有很多language bindings及其GObjectIntrospection層聲明以促進語言綁定。您可能還會對libffi感興趣(至少如果您正在實施某種語言)。

+0

非常感謝!現在我對這是如何工作有了一個更好的主意。PS:不能明白爲什麼總會有人會低估這些問題... – 2014-09-27 17:49:27

+0

我沒有downvote你的問題,但因爲它與你的源代碼無關,它可以被認爲是有點偏離主題,可能更適合http://programmers.stackexchange.com/ – 2014-09-27 22:19:44

+0

該死的我沒有意識到這一點。將來,我將使用該網站進行與編程相關的任何事情,但與代碼無直接關係。 – 2014-09-28 11:13:51