luasql.sqlite3模块已成功编译成我的C程序,静态链接。但是,该模块似乎还没有注册。在Lua脚本中,require 'luasql.sqlite3'的调用总是失败。
其他一些模块调用luaL_register来注册自己。但是在luaopen_luasql_sqlite3中不调用luaL_register。在这种情况下,如何注册luasql.sqlite3?
我使用Lua-5.1.5。
发布于 2012-11-07 15:01:33
下面是将luaopen_函数放入package.preload表的方法。
lua_getfield(L, LUA_GLOBALSINDEX, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, luaopen_socket_core);
lua_setfield(L, -2, "socket.core");发布于 2012-09-02 21:37:12
require使用动态链接库,因为它使用给定的模块名称来跟踪动态链接库,并从该动态链接库获取特定的函数。它不能自动用于静态库,因为C和C++没有内省;您不能动态地找到以luaopen_开头的C函数。
因此,您需要告诉Lua包系统,您想让这个模块对Lua代码可用。为此,您可以将luaopen_函数粘贴到package.preload表中,并为其指定将调用模块的名称。
发布于 2020-04-12 09:57:00
这适用于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接口执行need...and等操作。
local luasql = require "luasql.postgres";
pg = luasql.postgres();
dev, err = pg:connect( netidb_conninfo );
if err then .....请注意,你必须自己制作luaopen_luasql_postgres()等的原型,C才能成功编译,因为C库没有定义为外部使用的函数的原型。
https://stackoverflow.com/questions/12236032
复制相似问题