Posted on 2014-11-04 22:32
S.l.e!ep.¢% 阅读(4567)
评论(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)