lua動(dòng)態(tài)鏈接庫之單個(gè)so文件包含多個(gè)模塊(luaL_requiref函數(shù)的使用)
Posted on 2014-11-04 22:32 S.l.e!ep.¢% 閱讀(4646) 評論(0) 編輯 收藏 引用 所屬分類: Lua在hive的hive.lua文件中,第一行就是local c = require "hive.core"。
根據(jù)上一篇文章所說的,它是調(diào)用的hive文件夾下的core.so文件。
然而在其他hive文件夾下的system.lua前兩行是
local cell = require "cell",local system = require "cell.system",
但沒有看到這兩個(gè)so文件。
這個(gè)是怎么回事呢?查看src下的hive*lib.c都含有l(wèi)uaL_Reg這樣類似于hive.c中的用法。
然后找到hive.start()函數(shù)對應(yīng)的scheduler_start(),看到了和cell.system相關(guān)的一行代碼luaL_requiref(sL, "cell.system", cell_system_lib, 0);
接著去網(wǎng)上搜了下luaL_requiref()函數(shù)的作用,找到了lua源代碼的實(shí)現(xiàn),作用就是調(diào)用cell_system_lib然后把該模塊綁定到cell.system模塊名字下。
下面我就實(shí)現(xiàn)了一個(gè)so庫包含兩個(gè)模塊。
#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)
根據(jù)上一篇文章所說的,它是調(diào)用的hive文件夾下的core.so文件。
然而在其他hive文件夾下的system.lua前兩行是
local cell = require "cell",local system = require "cell.system",
但沒有看到這兩個(gè)so文件。
這個(gè)是怎么回事呢?查看src下的hive*lib.c都含有l(wèi)uaL_Reg這樣類似于hive.c中的用法。
然后找到hive.start()函數(shù)對應(yīng)的scheduler_start(),看到了和cell.system相關(guān)的一行代碼luaL_requiref(sL, "cell.system", cell_system_lib, 0);
接著去網(wǎng)上搜了下luaL_requiref()函數(shù)的作用,找到了lua源代碼的實(shí)現(xiàn),作用就是調(diào)用cell_system_lib然后把該模塊綁定到cell.system模塊名字下。
下面我就實(shí)現(xiàn)了一個(gè)so庫包含兩個(gè)模塊。
#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)