我正在尝试在我的应用程序中绑定Lua,现在我试图测试如何将Lua绑定到C ++中。我的问题很奇怪,因为我想在main()
之后的脚本中调用函数luaL_loadfile
。我的代码:
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include "lua.hpp"
#include "lauxlib.h"
#include "lualib.h"
using namespace std;
int main(int argc, char **argv) {
lua_State* lua = luaL_newstate();
luaL_openlibs(lua);
if (luaL_loadfile(lua, "test.lua") != 0) {
std::cout << lua_tostring(lua, -1) << "\n";
lua_pop(lua, 1);
return 1;
}
lua_getfield(lua, LUA_REGISTRYINDEX, "main");
if (lua_pcall(lua, 0, 1, 0) != 0) {
printf("Error running function 'main': %s\n", lua_tostring(lua, -1));
return 1;
}
lua_close(lua);
return 0;
}
我的输出是:
运行'main'函数时出错:尝试调用nil值
答案 0 :(得分:2)
我在本文中使用源代码Extending a C++ Application with Lua 5.2汇总了一个将lua 5.2嵌入到Visual Studio 2005控制台项目中的示例。
从你的lua脚本调用main()真的没有意义,因为main()是你的应用程序的入口点,你需要做Lua初始化的东西,只做一次。
我放在一起的示例和文章显示了使用Lua 5.2和C ++,并能够调用您从Lua脚本创建的C函数。该示例还显示了从C ++程序调用Lua函数。
我大约一年前使用Visual Studio 2005做过这个。我怀疑从Visual Studio 2005到2012将是直截了当的。我不确定移植到另一个编译器和开发环境是多么简单。至少,与Visual Studio 2005中的Windows控制台应用程序一起使用的_tmain()函数需要重命名为main()。
答案 1 :(得分:2)
尝试使用luaL_dofile
代替luaL_loadfile
。
这是最常见的错误之一:luaL_loadfile
加载文件但不运行它;它只是在堆栈上留下一个表示已加载文件的函数,可以调用它。函数main
仅在脚本运行时定义,即调用脚本函数时定义。错误消息试图告诉您。 (我假设你的脚本定义了一个名为main
的函数。没有任何实际需要,但它是无害的。)