我最近用5.2学习,我想尝试这样做: 第1步,为lua构建一个c模块: #include "lua.h"#include "lauxlib.h"#include "lualib.h"#include stdlib.hstatic int add(lua_State *L) { int x = luaL_checkint(L, -2); int y = luaL_checkint(L
第1步,为lua构建一个c模块:
#include "lua.h" #include "lauxlib.h" #include "lualib.h" #include <stdlib.h> static int add(lua_State *L) { int x = luaL_checkint(L, -2); int y = luaL_checkint(L, -1); lua_pushinteger(L, x + y); return 1; } static const struct luaL_Reg reg_lib[] = { {"add", add} }; int luaopen_tool(lua_State *L) { luaL_newlib(L, reg_lib); lua_setglobal(L, "tool"); return 0; }
我用liblua.a编译并链接它,我确信它在lua脚本中运行良好,例如“require(”tool“)tool.add(1,2)”
第2步,我写了另一个想要在步骤1中要求我的c模块的C程序,如下所示:
#include "lua.h" #include "lauxlib.h" #include "lualib.h" #include <stdlib.h> int main(int argc, char* const argv[]) { lua_State *L = luaL_newstate(); luaL_requiref(L, "base", luaopen_base, 1); luaL_requiref(L, "package", luaopen_package, 1); lua_getglobal(L, "require"); if (!lua_isfunction(L, -1)) { printf("require not found\n"); return 2; } lua_pushstring(L, "tool"); if (lua_pcall(L, 1, 1, 0) != LUA_OK) { printf("require_fail=%s\n", lua_tostring(L, -1)); return 3; } lua_getfield(L, -1, "add"); lua_pushinteger(L, 2); lua_pushinteger(L, 3); lua_pcall(L, 2, 1, 0); int n = luaL_checkint(L, -1); printf("n=%d\n", n); return 0; }
我也编译&链接liblua.a,但运行时出错:
“require_fail =检测到多个Lua VM”
某人的博客说,在lua5.2中,你应该动态地链接c模块和c主机程序,但不是静态的.
是否有人有同样的问题,或者我的代码中有错误,谢谢.
注意:
用-Wl,-E编译主程序解决了这个问题,非常感谢你的帮助^^.
从中创建.so时,不要将C模块与liblua.a链接.有关示例,请参阅我的Lua库页面: http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/.您可以将liblua.a静态链接到主程序中,但必须通过在链接时添加-Wl,-E来导出其符号.这就是Lua解释器在Linux中构建的方式.