【问题标题】:LuaBridge running C++ main function in lua for Love2DLuaBridge 在 lua 中为 Love2D 运行 C++ 主函数
【发布时间】:2016-09-19 09:06:45
【问题描述】:

这是我的 C++ 主函数:

int main() {
lua_State* L = luaL_newstate();
luaL_openlibs(L);
getGlobalNamespace(L).
        beginNamespace("o").
            beginClass<Object>("Object").
                addConstructor<void (*) (double, double)>().
                addProperty("width", &Object::getWidth, &Object::setWidth).
                addProperty("height", &Object::getHeight, &Object::setHeight).
                addProperty("x", &Object::getX, &Object::setX).
                addProperty("y", &Object::getY, &Object::setY).
            endClass().
        endNamespace();
lua_pcall(L, 0, 0, 0);
luaL_dofile(L, "main.lua");}

这是我用于 Love2D 的 main.lua

function love.load()
   obj = o.Object(10, 20) end

当我尝试用爱运行它时,它说 obj 是一个 nil 值,我意识到 Love2D 并没有在 C++ 中运行我的主函数来创建对象类。 如何使用 LuaBridge 在 Lua 中调用 C++ 主函数?

【问题讨论】:

    标签: c++ lua luabridge


    【解决方案1】:

    您正在做的是使用两个独立的程序:一个是您使用“主函数”构建的,另一个是实际的 Love2D 可执行文件。它们是独立的可执行文件;他们彼此之间没有更多的关系,就像lua.exepython.exe 之间的关系一样。

    您似乎想要 编写一个 Love2D 使用的 C++ 库。您可以这样做,但它要求您编写的不是 C++ 程序,而是动态库。你必须编写一个 Lua C 模块。

    如何编写动态库取决于您选择的平台。但该动态库必须导出适当的函数,详见the Lua 5.1 documentation。如果您的 C 模块名为“test”,那么它必须导出一个名为 luaopen_test 的函数。

    这个函数的工作本质上就是你的main 所做的。您的 luaopen_ 函数不必创建 Lua 状态;会给它一个。它的工作是返回一个表,其中包含您要在模块中导出的函数和 API。因此它会根据需要向 Lua 注册所有内容。

    您的main 将其内容放在全局“命名空间”中,但这通常被认为是非常粗鲁的。最好建立一个本地表并将你的东西放在那里,将表作为返回值返回。我不熟悉 LuaBridge 的 API,所以我不知道该怎么做。

    最坏的情况是你可以像现在一样构建一个全局表,但是在构建它之后,将它加载到本地表中,清除全局条目,然后返回表。

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 2013-04-14
      • 2019-03-23
      • 2021-11-23
      • 2021-08-13
      • 2013-03-07
      • 2022-01-11
      • 1970-01-01
      • 2021-02-07
      相关资源
      最近更新 更多