Posted on 2014-11-04 22:32
S.l.e!ep.¢% 閱讀(4624)
評論(0) 編輯 收藏 引用 所屬分類:
Lua
在hive的hive.lua文件中,第一行就是local c = require "hive.core"。
根據上一篇文章所說的,它是調用的hive文件夾下的core.so文件。
然而在其他hive文件夾下的system.lua前兩行是
local cell = require "cell",local system = require "cell.system",
但沒有看到這兩個so文件。
這個是怎么回事呢?查看src下的hive*lib.c都含有luaL_Reg這樣類似于hive.c中的用法。
然后找到hive.start()函數對應的scheduler_start(),看到了和cell.system相關的一行代碼luaL_requiref(sL, "cell.system", cell_system_lib, 0);
接著去網上搜了下luaL_requiref()函數的作用,找到了lua源代碼的實現,作用就是調用cell_system_lib然后把該模塊綁定到cell.system模塊名字下。
下面我就實現了一個so庫包含兩個模塊。
#include "lua.h"
#include "lauxlib.h"
?
#include <stdio.h>
?
int
dylib_add(lua_State* L) {
??? int a = lua_tonumber(L,1);
??? int b = lua_tonumber(L,2);
??? int c = a+b;
??? lua_pop(L,2);
??? lua_pushnumber(L,c);
??? return 1;
}
?
int dylib2_test(lua_State* L);
int start(lua_State* L) {
??? luaL_requiref(L, "dylib2.test", dylib2_test, 0);
??? return 0;
}
?
int
luaopen_dylib_test(lua_State* L) {
??? luaL_Reg l[] = {
?????? { "add", dylib_add },
?????? { "start", start },
?????? { NULL, NULL },
??? };
??? luaL_checkversion(L);
??? luaL_newlib(L,l);
?
??? return 1;
}
?
int
dylib2_test(lua_State* L) {
??? luaL_Reg l[] = {
?????? { "add", dylib_add },
?????? { NULL, NULL },
??? };
??? luaL_checkversion(L);
??? luaL_newlib(L,l);
?
??? return 1;
}
dylib = require "dylib.test"
?
local c = dylib.add(1,2)
print(c)
?
dylib.start()
?
dylib = require "dylib2.test"
?
local c = dylib.add(1,2)
print(c)