首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在静态链接的C程序中嵌入luasql.sqlite3?

如何在静态链接的C程序中嵌入luasql.sqlite3?
EN

Stack Overflow用户
提问于 2012-09-02 20:41:56
回答 3查看 556关注 0票数 1

luasql.sqlite3模块已成功编译成我的C程序,静态链接。但是,该模块似乎还没有注册。在Lua脚本中,require 'luasql.sqlite3'的调用总是失败。

其他一些模块调用luaL_register来注册自己。但是在luaopen_luasql_sqlite3中不调用luaL_register。在这种情况下,如何注册luasql.sqlite3

我使用Lua-5.1.5。

The source code of luaopen_luasql_sqlite3 is at the bottom

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-07 15:01:33

下面是将luaopen_函数放入package.preload表的方法。

代码语言:javascript
复制
lua_getfield(L, LUA_GLOBALSINDEX, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, luaopen_socket_core);
lua_setfield(L, -2, "socket.core");
票数 2
EN

Stack Overflow用户

发布于 2012-09-02 21:37:12

require使用动态链接库,因为它使用给定的模块名称来跟踪动态链接库,并从该动态链接库获取特定的函数。它不能自动用于静态库,因为C和C++没有内省;您不能动态地找到以luaopen_开头的C函数。

因此,您需要告诉Lua包系统,您想让这个模块对Lua代码可用。为此,您可以将luaopen_函数粘贴到package.preload表中,并为其指定将调用模块的名称。

票数 1
EN

Stack Overflow用户

发布于 2020-04-12 09:57:00

这适用于LuaSQL 2.4和Lua 5.1及更高版本...

在C中

代码语言:javascript
复制
/* 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等操作。

代码语言:javascript
复制
 local luasql = require "luasql.postgres";
 pg = luasql.postgres();
 dev, err = pg:connect( netidb_conninfo );
 if err then .....

请注意,你必须自己制作luaopen_luasql_postgres()等的原型,C才能成功编译,因为C库没有定义为外部使用的函数的原型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12236032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档