![](/img/trans.png)
[英]Lua script with C++ : attempt to index global 'io' (a nil value)
[英]C++ & Lua - attempt to index a nil value error
我目前正在學習如何使Lua與C ++一起使用,但我偶然發現了這個問題。 這是我目前正在使用的小應用程序:
#include <lua.5.2.3\src\lua.hpp>
#include <iostream>
#include <string>
int pluacall(lua_State *L){
std::cout << "Called from inside Lua." << std::endl;
return 0;
}
int main(){
std::string x;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {} };
if (luaL_dofile(L, "test.lua")){
std::cout << "Error: " << lua_tostring(L, -1) << std::endl;
lua_pop(L, 1);
}
luaL_setfuncs(L, _funcs, 0);
lua_getglobal(L, "sup");
if (lua_pcall(L, 0, 0, 0)){
std::cout << "Error: " << lua_tostring(L, -1) << std::endl;
lua_pop(L, 1);
}
std::cout << "Test";
std::getline(std::cin, x);
lua_close(L);
return 0;
}
在我添加luaL_setfuncs(...)
之前,一切都可以正常工作。
現在,應用程序崩潰並出現以下錯誤:
PANIC: Unprotected error in call to Lua API (attempt to index a nil value)
我要說實話,我絕對不知道為什么它不起作用或者這個錯誤甚至意味着什么(谷歌今天不是我的朋友)。 有任何想法嗎?
還可能值得一提的是,我沒有將Lua庫與我的應用程序鏈接,而是將它們編譯在一起(所有Lua源代碼都添加到了項目中)
編輯:這是我正在測試的Lua腳本
function sup()
io.write("Hey.\n")
CppFunc()
return 1
end
void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
將數組l中的所有函數(請參見luaL_Reg)注冊到堆棧頂部的表中 (在可選的upvalue下方,請參見下一個)。
void luaL_newlib (lua_State *L, const luaL_Reg *l);
創建一個新表並在其中注冊列表l中的功能。 它通過以下宏實現:
(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
任一插入luaL_newlibtable(L, _funcs)
之前luaL_setfuncs
,或使用luaL_newlib(L, _funcs)
代替。 如果您不想將功能注冊到單獨的表中,而是注冊到全局名稱空間中,則可以使用以下方法:
lua_pushvalue(L, LUA_GLOBALSINDEX); // push _G table
luaL_setfuncs(L, _funcs, 0); // set funcs on _G
lua_pop(L, 1); // pop _G
嘗試顯式設置終止funcs數組的哨兵:
luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {NULL, NULL} };
我不認為編譯器會為它們提供默認的0值(但我不是100%),因此,如果不設置它們,最終可能會導致垃圾指針,從而導致崩潰。
注釋后編輯,上面的內容無濟於事:
如果這不是問題,請嘗試使用luaL_newlib代替luaL_setfuncs:它似乎使用luaL_newlibtable在表上創建一個表,然后調用setfuncs在其中注冊函數:
luaL_newlib(L, _funcs);
(令我驚訝的是,找到與此相關的清晰文檔/示例非常困難)。 在SO上看到對類似問題的很好回答 。
因此,我並沒有完全按照自己的想法解決此問題,但是總比沒有好。
我將luaL_setfuncs()
更改為lua_register()
,現在一切似乎都可以工作了。 有什么問題-我不知道。
我以為luaL_setfuncs()
是現在向Lua注冊C函數的luaL_setfuncs()
方法,但是它不起作用,所以我不得不堅持通過lua_register()
注冊所有內容。
如果我獲得有關此問題的更多信息,我將編輯此帖子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.