Lua:如何在C程序中嵌入luasql.sqlite3(静态链接)?

时间:2012-09-02 12:41:56

标签: c sqlite lua luasql

luasql.sqlite3模块已成功编译到我的C程序中,静态链接。但是,似乎该模块尚未注册。在Lua脚本中,“require'luasql.sqlite3'”的调用总是失败。其他一些模块调用luaL_register函数来注册自己。但luaL_register不是在luaopen_luasql_sqlite3函数中调用的。在这种情况下如何注册luasql.sqlite3?我使用Lua-5.1.5。

The source code of luaopen_luasql_sqlite3 is at the bottom

2 个答案:

答案 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语言 库没有定义函数的原型,因此编译成功 供外部使用。