Я впервые пытаюсь встроить 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;
}
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
Во-первых, почему бы и нет #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
, Вы все еще должны проверить возвращаемое значение.
Других решений пока нет …