分步骤总结一下在做这样一个小实例的过程中进行的工作和遇到的问题。
参考博客:
lua和c语言互相调用的例子
VS2012建立调用lua脚本工程
Lua环境
首先需要配置一下Lua语言环境,下载Lua的解释器
示例中我使用的是Lua 5.1版本
新建和配置C++工程
在VS2012中新建一个“Win32 控制台应用程序”。
然后配置头文件目录:
右键单击项目->属性->VC++目录
在包含目录中添加Lua5.1中的include文件夹的路径,因为在C++中需要包含这个目录下的头文件。
然后添加依赖库:
右键单击项目->连接器->输入
在附加依赖项中添加Lua5.1中lib目录下的lib51.lib文件路径。这是执行lua脚本必不可少的库。
编写C++代码
在主函数(win32平台下,主函数名为_tmain)所在的cpp文件中编写如下代码:
// TestCppLua.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
//包含lua相关头文件
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
//添加一个C++语言函数
int add(lua_State* L)
{
//从lua状态机的栈中取出索引为1的int型数值
int x = luaL_checkint(L, 1);
//从lua栈中取出索引为2的int型数值
int y = luaL_checkint(L, 2);
printf("result:%d + %d = %d\n", x, y, x + y);
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_State* L = luaL_newstate(); //新建一个lua状态机
luaL_openlibs(L); //打开相关的库
lua_pushcfunction(L, add); //将c++函数add入栈
lua_setglobal(L, "ADD"); //设置全局符号ADD
//加载lua脚本文件,这里使用了需要执行的Lua脚本文件的绝对路径
if (luaL_loadfile(L, "E:\\TestProj\\TestCppProj\\TestCppLua\\TestCppLua\\myLua.lua"))
{
printf("error in load lua file.");
}
//执行一次脚本,生成function
lua_pcall(L, 0, 0, 0);
//将lua函数myfunction入栈
lua_getglobal(L, "myfunction");
//执行脚本,执行function
lua_pcall(L, 0, 0, 0);
printf("Lua is done.");
getchar();
return 0;
}
编写Lua脚本
新建了一个myLua.lua文件,在文件中写下如下的代码:
-- 定义一个myfunction函数
function myfunction()
print("in myLua")
ADD(1, 2) -- 调用ADD函数
ADD(100, 200)
end
运行这个实例
在VS2012中,调试我的win32控制台应用程序。在配置好包含目录和依赖库的情况下,代码一次编译通过
调试窗口如图:
运行过程总结
在C++中
1.定义一个add函数。
2.新建一个Lua状态机。
3.打开lua相关库。
4.函数add入栈,并设置全局变量ADD来表示C++中的add函数,可以在lua脚本中使用ADD来访问C++中的add函数。
5.加载lua脚本文件。
6.执行一次脚本,如果不执行,则lua脚本中定义的全局函数myfunction不会存在。
7.将lua脚本中的函数myfunction入栈。
8.再执行脚本,即会执行myfunction函数。
在Lua中
1.定义一个myfunction函数。在myfunction函数中调用全局函数ADD(这个函数实际是在C++代码中添加到Lua状态机中的)。
深入学习
看懂了上述过程,理解了C++调用Lua脚本的基本过程之后可以来看看这篇博客
Lua和C++交互详细总结
通过这篇博客可以更深入了解C++与Lua语言的配合使用。感谢以上几位博主。