Я пытаюсь переопределить функцию печати, как описано в этот вопрос. Вот мой код:
extern "C"{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#include <iostream>
using namespace std;
lua_State* L;
static int l_my_print(lua_State* L) {
int nargs = lua_gettop(L);
for (int i=1; i <= nargs; i++) {
if (lua_isstring(L, i)) {
cout << "!!!" << lua_tostring(L, i) << "!!!" << endl;
}
}
return 0;
}
static const struct luaL_Reg printlib [] = {
{"print", l_my_print},
{NULL, NULL} /* end of array */
};
extern int luaopen_luamylib(lua_State *L)
{
lua_getglobal(L, "_G");
luaL_register(L, NULL, printlib);
lua_pop(L, 1);
}int main(){
L = luaL_newstate();
luaL_openlibs(L);
luaopen_luamylib(L);
luaL_dostring(L, "print(\"hello\")");
lua_close(L);
return 0;
}
Когда я пытаюсь скомпилировать код, я получаю:
$ g++ -I/usr/include/lua5.2 -o embed test.cpp -Wall -Wextra -llua5.2
test.cpp:28:1: error: elements of array ‘const luaL_reg printlib []’ have incomplete type
test.cpp:28:1: error: storage size of ‘printlib’ isn’t known
test.cpp: In function ‘int luaopen_luamylib(lua_State*)’:
test.cpp:33:34: error: ‘luaL_register’ was not declared in this scope
test.cpp:35:1: warning: no return statement in function returning non-void [-Wreturn-type]
Кто-нибудь может объяснить, что здесь происходит? я скучаю по библиотеке или что-то?
ОБНОВИТЬ
Было отмечено, что структура называется luaL_Reg
не luaL_reg
, Это решило мою первую проблему:
$ g++ -I/usr/include/lua5.2 -o embed test.cpp -Wall -Wextra -llua5.2
test.cpp: In function ‘int luaopen_luamylib(lua_State*)’:
test.cpp:33:34: error: ‘luaL_register’ was not declared in this scope
test.cpp:35:1: warning: no return statement in function returning non-void [-Wreturn-type]
Первая ошибка: это luaL_Reg
не luaL_reg
,
Вторая ошибка:
Функция luaL_register устарела (в Lua 5.2) и доступна только в том случае, если LUA_COMPAT_MODULE определено до включения заголовков Lua. Вместо этого вы должны использовать luaL_setfuncs.
Других решений пока нет …