博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在C++中使用Lua
阅读量:4056 次
发布时间:2019-05-25

本文共 2446 字,大约阅读时间需要 8 分钟。

 1. 下载Lua源码

Lua源码下载地址

 

2. 创建Lua静态库

在vs2008中创建一个静态库项目(我创建的叫LuaLib),注意:一定要取消“预编译头”选项;
建成后将Lua源码的.h和.c加入该项目
进入项目属性,修改编译输出,方便其他项目使用lib库
配置属性->常规->输出目录,设置为“$(SolutionDir)\lib\”
配置属性->管理员->常规->输出文件,设置为“$(OutDir)\$(ProjectName)d.lib”
编译,有一些警告,可以不用管
在Lualib文件夹下的lib文件中有输出的lualibd.lib

 

3. 创建Test

在LuaLib解决方案中新建Win32控制台程序testLua

 

4. 引入前面生产的Lualib库

进入testLua项目属性
配置属性->C/C++->常规->附加包含目录,设置为“..\lib\”
配置属性->链接器->常规->附加库目录,设置为“..\lib\”
配置属性->链接器->输入->附加依赖项,设置为“Lualibd.lib”
同时还需要将Lua源码中的以下几个头文件放在lib文件夹中,方便项目引用
lauxlib.h
lua.h
luaconf.h
lualib.h

 

5. 编写C++代码

#include "stdafx.h"#include 
#include
using namespace std;extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"}int fcAdd(lua_State *lu){ int a = lua_tointeger(lu, 1); int b = lua_tointeger(lu, 2); lua_pushnumber(lu, a+b); //结果压栈 return 1; //返回1个结果}int _tmain(int argc, _TCHAR* argv[]){ int nret = 0; lua_State *lu = luaL_newstate(); luaL_openlibs(lu); //栈操作 lua_pushinteger(lu, 2); lua_pushinteger(lu, 3); int n = lua_tointeger(lu, 1); n = lua_tointeger(lu, 2); int nStack = lua_gettop(lu); lua_pop(lu, 2); nStack = lua_gettop(lu); //执行内存脚本 string str = "print (\"Hello world!\")"; luaL_loadbuffer(lu, str.c_str(), str.length(), "line"); lua_pcall(lu, 0,0,0); //加载脚本中定义的变量 nret = luaL_dofile(lu, "..\\scripts\\test.lua"); lua_getglobal(lu, "aa"); lua_getglobal(lu, "bb"); int bb = lua_tointeger(lu, -1); int aa = lua_tointeger(lu, -2); //执行脚本中定义的无参函数 lua_getglobal(lu, "hello"); nret = lua_pcall(lu, 0,0,0); //执行脚本中定义的有参函数 lua_getglobal(lu, "fadd"); lua_pushnumber(lu, aa); lua_pushnumber(lu, bb); nret = lua_pcall(lu, 2,1,0); if (nret != 0) { const char *pc = lua_tostring(lu, -1); cout << pc; } else { nret = lua_tointeger(lu, -1); cout << "调用脚本函数:" << endl; cout << aa << " + " << bb << " = " << nret << endl; lua_pop(lu, 1); } //脚本中调用C++函数 lua_pushcfunction(lu, fcAdd); lua_setglobal(lu, "fcAdd"); lua_getglobal(lu, "fc"); lua_pushnumber(lu, aa); lua_pushnumber(lu, bb); nret = lua_pcall(lu, 2,1,0); if (nret != 0) { const char *pc = lua_tostring(lu, -1); cout << pc; } else { nret = lua_tointeger(lu, -1); cout << "调用C++函数:" << endl; cout << aa << " + " << bb << " = " << nret << endl; lua_pop(lu, 1); } lua_close(lu); std::system("pause"); return 0;}

 

6.  Lua脚本代码

在LuaLib文件夹下创建scripts文件夹,在其中创建test.lua,代码如下:

aa=2;bb=3;function hello(a,b) print ("Hello in script!")endfunction fadd(a,b) return a+bendfunction fc(a,b)  return fcAdd(a,b)end

示例源码下载地址:
 

转载地址:http://ogrci.baihongyu.com/

你可能感兴趣的文章
微信小程序开发全线记录
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
Android/Linux 内存监视
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>