lua中使用c動態庫,像luacjson(支援unicode),luasocket,都是以動態鏈結庫的形式在lua中使用的,至於怎麼寫這些動態鏈結庫很少有教程說到,下面我就說說如何把c檔案編譯成動態庫。
首先,假設需要在lua中呼叫乙個在c中實現的求和函式,函式名add(a,b)。
我給這個測試庫取名為dylib,它包含乙個函式add。lua中這樣使用:
local dylib = require "dylib.test"
local c = dylib.add(1,2)
print(c)
上面的dylib.test就是我編譯生成的dylib/test.so檔案。這個檔案該怎麼生成?如下:
intluaopen_dylib_test(lua_state* l) ,,};
lual_checkversion(l);
lual_newlib(l,l);
return 1;
}這個函式名有個命名規則,字首為luaopen,後面就是lua中require的字串(將'.'轉換成'')。當執行到require "dylib.test"時,lua解析器會去dylib/test.so檔案中尋找並執行函式名為luaopen_dylib_test的函式。找不到則報錯:
lua: error loading module 'dylib.test' from file './dylib/test.so':
./dylib/test.so: undefined symbol: luaopen_dylib_test
stack traceback:
[c]: in ?
[c]: in function 'require'
test.lua:1: in main chunk
[c]: in ?
注意到dylib_add就是就是要實現的dylib.add函式。現在實現它:
intdylib_add(lua_state* l)
這函式就是把兩引數加起來,然後返回和。最後編譯生成so檔案:
gcc -g -wall --shared -fpic -o dylib/test.so dylib_test.c
注意要給它建乙個資料夾dylib。因為require的時候會把"dylib.test"轉成"dylib/test"預設去該路徑下尋找so或者lua檔案。當然,你修改了搜尋路徑那是另外一回事了。
基本的就是這樣子了。正在看雲風的hive遊戲伺服器框架(skynet的精簡版,不是apache hive)。
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...
靜態鏈結庫,動態鏈結庫
關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...