目的
- 在C++中建立lua运行环境,可以跑基本的lua脚本
- 执行以下lua代码
print("hello world")
- 输出结果
hello world
准备lua库
- 直接去lua.org 下lua源码
- 如果不用makefile转成vs工程话,也可以直接创建新vs项目,把文件拖进去就可以了,注意项目中声明宏LUA_BUILD_AS_DLL
- 在自己的工程里引lua.lib, 头文件目录也设置到src目录
- 由于lua是C生成了,为了不让其他文件引用麻烦,并为隐藏lua的调用,建议lua调用都在cpp文件中调用 。
Lua的调用流程
- 建立lua_State对象,例如调用 luaL_newstate
- 加载必要的lua库, 例如luaL_openlibs,可以加载所有的lua库
- 调用lua脚本,例如luaL_dofile,可以加载并执行文件
- 关闭lua, 调用lua_close
代码展示
lua_imp.cpp
#ifdef __cplusplus
extern "C" {
#endif
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#ifdef __cplusplus
}
#endif
#include <string>
#include <iostream>
#include <fstream>
#include <map>
static const char* lua_script_path = "../Scripts/";
static std::map<int, std::string> _E_ERR_STR = {
std::make_pair(LUA_OK, "no errors"),
std::make_pair(LUA_ERRRUN, "a runtime error"),
std::make_pair(LUA_ERRMEM, "memory allocation error.For such errors, Lua does not call the message handler"),
std::make_pair(LUA_ERRERR, "error while running the message handler"),
std::make_pair(LUA_ERRSYNTAX, "syntax error during precompilation"),
std::make_pair(LUA_YIELD, "the thread(coroutine) yields"),
std::make_pair(LUA_ERRFILE, "a file - related error; e.g., it cannot open or read the file")
};
void test_lua() {
lua_State* L = luaL_newstate();
luaL_openlibs(L);
std::string main_file = lua_script_path;
main_file += "main.lua";
int res = luaL_dofile(L, main_file.c_str());
if (res != LUA_OK) {
// 打印错误
auto it = _E_ERR_STR.find(res);
if (it != _E_ERR_STR.end()) {
std::cout << _E_ERR_STR[res] << std::endl;
}else {
std::cout << "Unknow error occurted!!!" << std::endl;
}
}
lua_close(L);
L = NULL;
}
main.cpp
int main()
{
extern void test_lua();
test_lua();
}