gpt4 book ai didi

c++ - Lua5.2嵌入C++

转载 作者:太空狗 更新时间:2023-10-29 21:23:01 27 4
gpt4 key购买 nike

我第一次尝试将 Lua 嵌入到 C++ 中。我已经搜索了 2 天了,但是大多数互联网教程都使用 lua5.1,它与 lua5.2 不兼容。所以我阅读了一些 lua 文档、示例源代码,最后我得到了这个:

main.cpp :

#include "luainc.h"
#include <iostream>

int main(){
int iErr = 0;
lua_State *lua = luaL_newstate (); // Open Lua
luaopen_io (lua); // Load io library

if ((iErr = luaL_loadfile (lua, "hw.lua")) == 0)
{
std::cout<<"step1"<<std::endl;

if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
{
std::cout<<"step2"<<std::endl;

lua_getglobal (lua, "helloWorld"); // Push the function name onto the stack

if (lua_type(lua, lua_gettop(lua)) == LUA_TNIL) {
// if the global variable does not exist then we will bail out with an error.
std::cout<<"global variable not found : helloworld"<<std::endl;

/* error so we will just clear the Lua virtual stack and then return
if we do not clear the Lua stack, we leave garbage that will cause problems with later
function calls from the application. we do this rather than use lua_error() because this function
is called from the application and not through Lua. */

lua_settop (lua, 0);
return -1;
}

// Function is located in the Global Table
/* lua_gettable (lua, LUA_GLOBALSINDEX); */ //lua5.1
lua_pcall (lua, 0, 0, 0);
}
}

lua_close (lua);

return 0;
}

硬件.lua :

-- Lua Hello World (hw.lua)
function helloWorld ()
io.write ("hello World")
end

luainc.h :

#ifndef __LUA_INC_H__
#define __LUA_INC_H__

extern "C"
{
#include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lua.h>
#include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lauxlib.h>
#include </home/renardc/Documents/Programmation/Lua_CPP/lua-5.2.2/src/lualib.h>
}

#endif // __LUA_INC_H__

我没有错误,输出是:

step1
step2

这应该意味着我的“helloworld”函数已经找到了。但由于我在输出中看不到“Hello World”,我怀疑该函数尚未被调用。我做错了什么?

这是我编译程序的方式:

g++ main.cpp -L/usr/local/include -I/usr/local/include -llua

最佳答案

首先,为什么不用 #include "lua.hpp",它是 Lua 自带的,主要做你的 luainc.h 做的事情?

您的代码有两个问题:

  1. luadL_loadfile 失败时,您不会发出任何错误消息。

  2. 您使用 lua_pcall 调用 helloWorld 但未测试其返回值。

当您将 lua_pcall 更改为 lua_call 时,您会收到此错误消息:

attempt to index global 'io' (a nil value)

这意味着你在调用luaopen_io后忘记设置全局io。只需添加 lua_setglobal(lua,"io") 即可。与 Lua 5.1 不同,Lua 5.2 不会在您打开库时自动设置全局变量,除非库本身会这样做,这是不鼓励的。

您可能最好调用 luaL_openlibs 来打开所有标准 Lua 库而不会感到意外。

您也可以使用 luaL_dofile 而不是 luaL_loadfile 并保存第一个 lua_pcall。您仍然需要检查返回值。

关于c++ - Lua5.2嵌入C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19315192/

27 4 0
文章推荐: c# - 无法将类型 'System.EventHandler' 隐式转换为 'System.EventHandler' 以完成 Storyboard