C++从Lua脚本调用函数
C++ Calling function from Lua script
我正在尝试在我的应用程序中绑定Lua,现在我正在尝试测试如何将Lua绑定到C++中。我的问题很奇怪,因为我想在luaL_loadfile
之后,在开始时从脚本中调用函数main()
。我的代码:
#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': %sn", lua_tostring(lua, -1));
return 1;
}
lua_close(lua);
return 0;
}
我的输出是:
运行函数"main"时出错:尝试调用零值
在本文中,我用源代码"用lua 5.2扩展C++应用程序"给出了一个将lua 5.2嵌入Visual Studio 2005控制台项目的示例。
从lua脚本中调用main()对您来说真的没有意义,因为main()是应用程序的入口点,而且您需要做一些lua初始化的事情,而且只需要做一次。
这个例子和我放在一起的文章展示了将Lua 5.2与C++结合使用,并能够调用您从Lua脚本中创建的C函数。该示例还显示了从C++程序调用Lua函数。
大约一年前,我使用VisualStudio2005完成了这项工作。我怀疑从VisualStudio2005到2012会很简单。我不确定移植到另一个编译器和开发环境会有多简单。Visual Studio 2005中与Windows控制台应用程序一起使用的_tmain()函数至少需要重命名为main()。
尝试luaL_dofile
而不是luaL_loadfile
。
这是最常见的错误之一:luaL_loadfile
加载文件但不运行它;它只是在堆栈上留下一个表示已加载文件的函数,随时可以调用。函数main
将仅在脚本运行时定义,即在调用脚本函数时定义。错误消息试图告诉你这一点。(我假设你的脚本定义了一个名为main
的函数。没有任何实际需要,但它是无害的。)
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?