Lua源码分析教程(二):C++程序调用Lua脚本

在当前解决方案下创建C++ Win32控制台程序,便于和Lua源码调试。

我创建的是HelloLua项目,右键HelloLua属性

C/C++ 常规---附加包含目录,添加LuaSrc目录

链接器—常规,添加生成的Lua5.3.4.lib目录

链接器---输入---依赖项

OK,Lua的环境属性配好了,如果有C++开发经验的应该很熟悉该流程。

下面编写代码:

// HelloLua.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

/*

C++ 调用 Lua

*/

// 这是个C++程序, 所以要extern "C", 因为lua的头文件都是C格式的
extern "C" {
	#include "lua.h"
	#include "lualib.h"
	#include "lauxlib.h"
}

int main()
{
	lua_State* L;

	//初始化lua,在5.2版本之前是用lua_open函数,发现这个函数在5.2中已经被遗弃,
	//被新的函数luaL_newstate和lua_newstate替代。lua_newstate可自定义内存分配函数,
	//luaL_newstate使用默认的内存分配方式.
	L = luaL_newstate();

	luaopen_base(L);

	//load Lua base libraries
	luaL_openlibs(L);
	
	//加载1.lua文件,之前的版本luaL_dofile()函数的第二个参数要写绝对路径,否则执行后会提示“unprotected error in call to lua api(attampt to call a nil value)”错误
	luaL_dofile(L, "1.lua");

	//获取Lua脚本中的函数名
	lua_getglobal(L, "add");

	//传参,传入第一个参数
	lua_pushnumber(L, 3);
	//传入第二个参数
	lua_pushnumber(L, 4);

	//调用函数:带有2个参数和1个返回值
	lua_call(L, 2, 1);

	//获取调用结果
	int sum = (int)lua_tonumber(L, -1);
	lua_pop(L, 1);

	cout << "The sum is " << sum << endl;

	//cleanup Lua 
	lua_close(L); 
	
	system("pause");
    return 0;
}

输出如下

代码没什么难度,大家自行理解,到此,源码编译OK,C++程序也写好了,那么就以这两个程序,由外而内剖析Lua源码。

猜你喜欢

转载自blog.csdn.net/yao_hou/article/details/86218458