【问题标题】:Embedding Lua modules on C side在 C 端嵌入 Lua 模块
【发布时间】:2015-05-18 11:41:04
【问题描述】:

我想为用户提供几个自定义函数以供使用,但隐藏它的实现以将其作为简单的 DLL 发布。
所以用户只需链接 dll 和插件就可以正常工作。在 C 端动态声明了几个表、整数等,但是从 C 声明“类”、面向表的函数会使代码不可读。
例如,有没有办法将 Lua 模块嵌入到标头中并预加载它,以便用户使用 luaL_loadfile 加载的主脚本能够访问它? 当然我可以通过在用户脚本中插入代码来破解它,但这似乎是个坏主意。

【问题讨论】:

    标签: c lua


    【解决方案1】:

    有没有办法将 Lua 模块嵌入到头文件中,例如,并预加载它,以便用户使用 luaL_loadfile 加载的主脚本能够访问它?

    是的。您可以使用bin2c.lua(或底部列出的任何替代方案)。

    这是来自名为 fakeredis.c 的项目的真实示例:

    Makefile 包含一个专用目标,该目标创建一个由要嵌入的各种模块的 Lua 字节码组成的标头:

    fklua.h:
        @echo "converting lua -> C..."
        @./lua2c.sh
    

    (在幕后 lua2c.sh 使用 bin2c.lua

    例如,该项目包含一个名为 fmtreply.lua 的模块。一旦转换,这个模块就被简单地定义为一个字节数组:

    /* fklua.h */
    
    /* this is the name of the main function the module exposes */
    #define FK_LUA_FMTREPLY "_fmtreply"
    
    /* this is the byte code of the module obtained with `bin2c.lua` */
    static const unsigned char fk_lua_fmtreply[]={45, 45, 32, ...};
    

    然后通过luaL_loadbuffer 将模块显式加载到主库中(有关详细信息,请参阅herethere)。

    【讨论】:

    • 我唯一想补充的是:使用 xxd -i binary_file 不是更好吗?它将生成准备使用的文件
    • 是的,您可以使用luacxxd 作为替代(-i 选项很方便)。就我而言,我所做的是等价的。
    猜你喜欢
    • 2012-03-13
    • 2011-05-30
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多