luasql.sqlite3模块已成功编译到我的C程序中,静态链接。但是,似乎该模块尚未注册。在Lua脚本中,“require'luasql.sqlite3'”的调用总是失败。其他一些模块调用luaL_register函数来注册自己。但luaL_register不是在luaopen_luasql_sqlite3函数中调用的。在这种情况下如何注册luasql.sqlite3?我使用Lua-5.1.5。
答案 0 :(得分:1)
require
适用于DLL,因为它使用给定的模块名来跟踪DLL并从该DLL获取特定的函数。它不能自动用于静态库,因为C和C ++没有内省;你无法动态地找到以luaopen_
开头的C函数。
因此,您需要告诉Lua软件包系统您要使该模块可用于Lua代码。您可以通过将luaopen_
函数放在package.preload
表中,为其指定将调用该模块的名称来执行此操作。
答案 1 :(得分:0)
这适用于LuaSQL 2.4和Lua 5.1及更高版本...
在C
/* Execute the luasql initializers */
lua_getglobal(L, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, luaopen_luasql_postgres);
lua_setfield(L, -2, "luasql.postgres");
lua_pop(L, 2);
lua_getglobal(L, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, luaopen_luasql_mysql);
lua_setfield(L, -2, "luasql.mysql");
lua_pop(L, 2);
在您的Lua脚本中为您需要的每个DBI接口etc等...然后>
local luasql = require "luasql.postgres";
pg = luasql.postgres();
dev, err = pg:connect( netidb_conninfo );
if err then .....
请注意,您将必须自己为Luaopen_luasql_postgres()等创建原型,以用于C语言 库没有定义函数的原型,因此编译成功 供外部使用。