在C++中使用Lua

我正在尝试在C++中使用Lua,但是我无法编译我的代码。我使用最新版本的Lua,目前是5.3。我的IDE是Code::Blocks。到目前为止,我一直在按照这些指南进行操作: https://eliasdaler.wordpress.com/2013/10/11/lua_cpp_binder/ http://gamedevgeek.com/tutorials/getting-started-with-lua/

但是它们都没有详细解释如何在C::B中设置Lua。我从Lua的网站下载了二进制压缩包和源代码。我不确定从src文件夹中应该放置哪些文件。到目前为止,我已将lauxlib.h、lua.h、luaconf.h以及lualib.h放入include目录,并在main.cpp中使用以下代码:

extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

到目前为止,我只是尝试运行以下简短的代码片段:

lua_State* L;
L = luaL_newstate();
luaL_openlibs(L);
luaL_dofile(L, "test.lua");
lua_close(L);

但我总是在第一行遇到错误。目前我收到的错误是‘luaL_newstate’的引用未定义。

也许我应该从源文件夹中将一些文件放入库目录中?或者在‘项目构建选项’菜单中的‘其他链接器选项’中添加一些内容?

编辑:

在此期间,我找到了这个问题: Lua 5.3 undefined references

看起来我需要将-llua放入‘其他链接器选项’中,但是lua.org中的包中没有.a、.so或.lib文件。

点赞
用户4258642
用户4258642

我终于成功让问题中提到的代码运行了。以下是我的做法:

  1. 我没有从 Lua 的官网下载源代码,而是下载了最新的 LuaDist。这个网站也可以在 Lua.org 的下载页面的二进制类别下找到。

  2. 在那个压缩包里,有通常的 include 和 lib 文件夹。

  3. 我将这两个文件夹都复制到了相应的文件夹中,并在 Build 选项菜单下设置了编译器和链接器的路径。

  4. 然后,在链接器设置选项卡下,我添加了 lib 文件夹中的 liblua.dll.a 文件。关于这最后两步,你可以在 SFML 设置页面中找到额外的帮助。

  5. 最后一步,我将 liblua.dll 文件放在编译好的可执行文件旁边。

2016-07-14 20:12:06
用户2816703
用户2816703

LUAC++的hello world示例

main.cpp

#include <iostream>

#ifdef __cplusplus
  extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
  }
#endif //__cplusplus

int main(int argc, char **argv) {
    std::cout << "LUA is saying: ";

    lua_State* L;
    L = luaL_newstate();
    lua_pushstring(L, "Anna");
    lua_setglobal(L, "name");
    luaL_openlibs(L);
    if(luaL_dofile(L, "hello.lua")) {
        std::cout << "Final:" << lua_tostring(L, -1) << "\n";
    }
    lua_close(L);
}

hello.lua

print("Hello World!")
print("Hello", name)

Makefile

hello: main.cpp
    g++ -I/usr/include/lua5.3/ main.cpp -llua5.3 -o hello

该示例创建了一个新的lua_State,它是主要上下文,将由lua引擎用于执行代码。 作为下一步,我们需要打开库,并如果需要添加将由lua使用的其他库。

在执行之前,我们可以在全局上下文中设置变量,这些变量可以通过将值推到堆栈上并调用lua_setglobal()来设置全局变量而访问变量。

最后,我们使用助手函数luaL_dofile(),它将执行文件并返回false(0)(如果没有错误),或true(1)(如果有错误)。如果出现错误,则状态中堆栈的最后一个值将是错误描述。

2021-03-22 14:49:52