C語言應用程序中經常使用動態鏈接機制集成各個模塊;不過,動態鏈接機制并不是ANSI C標準的一部分,也就是說實現方法是不可以移植的。
Lua通常不會包含任何無法通過ANSI C來實現的機制,如果動態鏈接是一個例外。Lua打破了對可移植性的準則,為幾種平臺實現了一套動態鏈接機制。
package.loadlib是動態鏈接功能的核心函數,接收兩個參數:動態庫的完整路徑名、函數名稱。
loadlib函數加載指定的庫,并將其鏈接入Lua;如你所想,并不會調用庫中的任何函數,而是將一個C函數作為Lua函數返回;如果load過程中發生任何錯誤,返回nil。
loadlib是一個比較底層的函數,通常使用require來加載C程序庫,這個函數會搜索指定的程序庫,然后調用loadlib來加載庫,并返回初始化函數,這個初始化函數應將庫中提供的函數注冊到Lua中。
作為一個簡單的實例:
復制代碼 代碼如下:
hello.c
#includestdio.h>
void hello(){
printf("hello,world\n");
}
編譯:gcc -o libhello.so -fPIC -shared hello.c
復制代碼 代碼如下:
> f = package.loadlib('${pathhere}/libhello.so', 'hello')
> f()
hello,world
hello()函數比較簡單,沒有參數,沒有返回值,具體的接口規范還需研究。