将Lua嵌入到C ++中

时间:2011-02-26 13:40:33

标签: c++ cross-platform lua

我想编写一个C ++ - 可以在执行期间交互/调用Lua脚本的程序。该程序的一个关键概念是完全平台独立性,但我似乎无法找到实际提供某些东西的Lua-build。

我到目前为止发现的Lua-builds要么基于环境变量,要么基于.lib.dll.so等特定库。来自lua.org的官方Lua-source也不是我想要的,因为它定义了一个主函数...

是否有一个简单的 - 最好的情况是像sqlite-amalgamation - 用于C / C ++的Lua-interpreter,它没有任何这些依赖项?

3 个答案:

答案 0 :(得分:7)

lua.c包含main并定义控制台应用程序的入口点。如果你从项目中删除它,那么如果你愿意的话,将构建版本留给独立的库或动态库,就好了。

答案 1 :(得分:4)

以下是我用作项目起点的内容(我发现类似的东西一段时间后调整它以便我可以更快地改变它):


lua脚本文件:

    -- Start
    -- Script: myscript.lua
    print("this is lua")
    -- End

C档案:

    #include <stdlib.h>
    #include <stdio.h>
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>

    int main(void) {
            static const luaL_reg lualibs[] = {
                    { "base",       luaopen_base },
                    { NULL,         NULL }
            };

            static void openlualibs(lua_State *l) {
                    const luaL_reg *lib;

                    for (lib = lualibs; lib->func != NULL; lib++) {
                            lib->func(l);
                            lua_settop(l, 0);
                    }
            }

            lua_State *l;
            l = lua_open();
            openlualibs(l);

            printf("now calling lua\n\n");
            lua_dofile(l, "myscript.lua");
            printf("\ndo something else\n\n");

            lua_close(l);
            return 0;
    }

您可以自由地使用它作为项目的基础。

答案 2 :(得分:3)

对于Lua核心和独立解释器的单文件合并版本,请参阅官方源代码包中的文件etc/all.c。您当然可以将它作为自己合并的基础,也许可以通过删除最后一行lua.c的引用。

许多嵌入Lua的大型应用程序只需将核心源文件添加到项目中即可。如果应用程序不允许扩展代码从.dll.so文件加载已编译的模块,则此方法尤其有效。如果您的应用程序将允许编译模块,那么通常最好链接核心的共享库,以便应用程序和加载的模块可以引用来自核心库的单个实例的符号。请注意,意外包含多个Lua核心实例几乎可以保证很难诊断症状。