我想爲一個C庫生成一個通用的lisp cffi包裝(SOIL),雖然我對cl有信心012ffcffi我不確定使用什麼庫或者如何使用開始使用它們。 基本上我會問一個更詳細的問題,但不知道我不知道什麼。如何爲一個簡單的c庫生成一個cffi包裝
回答
這裏有幾個包裝發生器,但有兩個名稱從組中脫穎而出,SWIG andVerrazano。
維拉薩諾是現在無人維護,因此確實應該不能依賴,但與土壤庫您使用它的工作...樣的! 以下步驟直接從using the kinect with common lisp上的示例中獲取。
首先,確保您已安裝gcxml。 (您可能需要修改根據您系統上的路徑)
sudo apt-get install gccxml
現在在你的REPL:對我來說,這樣做的目的如下
(ql:quickload :cffi)
(ql:quickload :verrazano)
(verrazano:generate-binding (list :cffi :package-name :soil :input-files (list "SOIL/SOIL.h")))
您現在已經在土壤中的包裝。 lisp文件。直接我發現問題,枚舉被命名爲非常奇怪(。-1 - 2等),這些相同的奇怪名稱正在導出。我刪除了這些並重命名了枚舉。然後你會發現這些枚舉不在函數調用中使用,所以你需要修改'defcfun'調用來使用它們。
如果你不習慣這樣做,我會建議找一個已經做過這個的庫來作爲指導。我發現lispbuilder在這方面有一些廣泛的例子。
SWIG絕對是更好的選擇,即使在複雜的庫中也能很好地爲您服務。 一般的做法是,你寫一個SWIG接口文件,告訴swig在哪裏找到庫,然後包裝哪些特徵。 SWIG文檔是廣泛的,非常好:
http://www.swig.org/Doc2.0/Contents.html#Contents
還檢查了他們的網頁上痛飲和Common Lisp的http://www.swig.org/Doc2.0/Lisp.html
現在它是使用,原因如下獨立的接口文件是一個好主意(攝來自swig文檔)
- 很少有必要訪問大包中的每個函數。許多C函數在腳本環境中可能很少或沒有用處。所以,爲什麼要包裝它們?
- 單獨的接口文件提供了一個機會來提供關於如何構建接口的更精確的規則。
- 接口文件可以提供更多的結構和組織。
- SWIG無法解析出現在頭文件中的某些定義。擁有一個單獨的文件可以消除或解決這些問題。
- 接口文件提供接口的更精確的定義。想要擴展系統的用戶可以訪問接口文件,並立即看到可用的內容,而無需將其從頭文件中挖掘出來。
......但是,你通常可以不用寫一個而讓SWIG解決它。對於土壤,這涉及以下內容:
編寫一個名爲soil.i的文件,並將其放入其中(您可能需要更改路徑)。
%module soil
%{
/* Includes the header in the wrapper code */
#include "/usr/include/SOIL/SOIL.h"
%}
/* Parse the header file to generate wrappers */
%include "/usr/include/SOIL/SOIL.h"
下運行下面的終端 痛飲-cffi - 模土壤soil.i
,你將有一個新的soil.lisp文件。與verrazano一樣,看看這個函數是如何看待這些枚舉是如何被使用的(或者更可能不被使用)。
現在,與這兩個你幾乎可以肯定想做的事情更''lispy'。通常會有指針傳遞給C函數所填充的函數,您將要從用戶隱藏C函數。
這是一個開始的地方,希望你能從這裏工作。 Ciao
- 1. 如何正確包裝一個C庫與Python CFFI
- 2. 如何爲python包裝一個C++庫?
- 3. SWIG製作BWAPI庫(C++)的CFFI包裝時發生錯誤
- 4. 一個簡單的隨機生成器
- 5. 生成一個簡單的折線圖
- 6. 如何爲一個DLL庫創建一個Python包裝
- 7. 創建一個簡單的C#包裝清理代碼
- 8. 使用jni包裝一個C++庫
- 9. 從XML生成一個簡單的C#類
- 10. 如何生成一個簡單的二維地形圖
- 11. 如何使用jQuery生成一個簡單的彈出框
- 12. 如何在批量中生成一個簡單的時鐘
- 13. 如何實現一個最簡單的C++可調用對象包裝器?
- 14. 如何在C++中優化一個簡單的數字類型包裝類?
- 15. 使用Cython打包一個包裝另一個庫的庫
- 16. 如何調用在MATLAB一個簡單的MATLAB函數生成的DLL從C#
- 17. 爲rails生成的XML API構建一個JavaScript包裝器?
- 18. 爲Java遊戲生成一個簡單的場景圖
- 19. 爲C++庫製作一個Objective-C包裝器
- 20. 如何將一個void *指針包裝成一個TCL對象
- 21. 如何爲C++函數創建一個c#包裝器?
- 22. C++創建一個「包裝」
- 23. 如何在PHP中生成一個簡短的唯一ID?
- 24. 如何包裝一個ngRepeat
- 25. 有人可以簡單地區分一個java庫,一個類和一個包
- 26. 如何生成若干包括()在一個倉庫
- 27. 爲C尋找一個簡單的MP3庫#
- 28. 爲C++尋找一個簡單的音頻播放庫
- 29. 創建簡單的C++ .net包裝。一步一步
- 30. C++/CLI包裝爲指針成員 - C++單一實例