S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
在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)

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理