我第一次尝试将Lua嵌入C ++中。我一直在寻找2天,但大多数互联网tutos使用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;
}
hw.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
答案 0 :(得分:3)
首先,为什么不是#include "lua.hpp"
,它与Lua一起提供并且主要与您的luainc.h
有关?
您的代码存在两个问题:
luadL_loadfile
失败时,您不会发出任何错误消息。
您使用lua_pcall
来呼叫helloWorld
,但不会测试其返回值。
当您将lua_pcall
更改为lua_call
时,会收到以下错误消息:
尝试索引全局'io'(零值)
这意味着您在调用io
后忘记设置全局luaopen_io
。只需添加lua_setglobal(lua,"io")
即可。与Lua 5.1不同,Lua 5.2在打开库时不会自动设置全局变量,除非库本身不这样做,不鼓励。
你可能最好不要让luaL_openlibs
打开所有标准的Lua库而不会有任何意外。
您也可以使用luaL_dofile
代替luaL_loadfile
并保存第一个lua_pcall
。您仍然需要检查返回值。