一. 下载

1. 本篇博客使用的版本为luabind-0.9.1,下载地址:http://download.csdn.net/download/yzf279533105/10109861

二. 编译

1. luabind-0.9.1在windows下的编译请参考:http://blog.csdn.net/yzf279533105/article/details/77828811

2. luabind-0.9.1在linux下的编译请参考:http://blog.csdn.net/yzf279533105/article/details/78483160

三. 示例代码下载:

1. windows下示例代码下载地址(环境是win7,VS2008,已编译出exe,下载后可随意修改代码,重新编译,进行测试):

https://download.csdn.net/download/yzf279533105/10365718

2. linux下示例点下载地址(环境是centos6.8,gcc4.4.7,已编译出可执行程序,下载后可随意修改代码,重新编译,进行测试。根目录下有详细介绍文档,根据文档里面的步骤进行操作,一定可以运行成功):

http://download.csdn.net/download/yzf279533105/10135089

3. 如有任何疑问,可联系本人QQ:279533105,添加时请注明来自CSDN

4. 2019-04-30有更新,新增加:

(1) C++结构体导出lua

(2) 参数为对象指针的函数导出到lua

本博客下面的代码同步了更新,但下载的示例代码并未更新,望周知

四. 使用(这里对C++和lua的各种交互情景都进行了示例测试)

C++测试代码如下:

#include <iostream>
using namespace std;#include "Lua_VM.h"
#include "luabind/luabind.hpp"
using namespace luabind;extern "C"
{#include "lua.h"#include "lualib.h"#include "lauxlib.h"
}// 要导出到lua中的函数
void greet()
{cout<<"hello world"<<endl;
}// 要导出到lua中的重载函数
int Add(int nNum1, int nNum2)           // int版的Add函数
{return nNum1 + nNum2;
}string Add(string str1, string str2)   // string版的Add函数
{return str1 + str2;
}// 要导出到lua中的枚举
enum enStudentType
{enStudentType_Little,          // 小学生enStudentType_Middle,         // 初中生enStudentType_High,               // 高中生enStudentType_Big,                // 大学生
};// 要导出到lua中的结构体
struct SScore{string    name;   // 名字int        score;  // 分数
};// 要导出到lua中的类
class CStudent
{
public:CStudent(string strName, int nAge, int nScore, string strScore){m_strName    = strName; // 名字m_nAge     = nAge;        // 年龄m_nScore   = nScore;  // 成绩(整型)m_strScore = strScore;    // 成绩(字符串型)m_nID        = 123;     // IDm_strNickName="dog";    // 绰号m_score.name = "match"; // 成绩:数学m_score.score = 100;    // 成绩:数学,100分m_nPos       = 12;}
public:enum enStateType{enStateType_Learn,      // 学习状态enStateType_Play,        // 玩耍状态enStateType_Sleep,       // 睡觉状态};public:// 获取名字string GetName(){return m_strName;}// 获取年龄int GetAge(){return m_nAge;}// 获取成绩(整型)int GetScore(int nNum1, int nNum2){return m_nScore;}// 获取成绩(字符串型)string GetScore(string str1, string str2){return m_strScore;}public:// 设置位置void SetPos(int nPos){m_nPos = nPos;}// 获取位置int GetPos(){return m_nPos;}
public:// 下面三个属性导出到luaint       m_nID;          // IDstring  m_strNickName; // 绰号SScore m_score;        // 成绩
private:string  m_strName;      // 名字int        m_nAge;         // 年龄int        m_nScore;       // 成绩(整型)string  m_strScore;        // 成绩(字符串型)int    m_nPos;         // 位置
};// 要导出到lua中的全局函数,参数为对象指针
string GetStudentName(CStudent* pStudent)
{return pStudent->GetName();
}// 要导出到lua中的继承类
class CPeople
{int sex;               // 性别
};class CMan : public CPeople
{int nBeard;                // 胡须
};// 导出到lua
int ExportToLua(lua_State* L)
{open(L);// 导出到lua全局表module(L)[// 把全局函数greet()导出到lua中def("greet", &greet),    // 全局函数(参数是对象指针)def("GetStudentName", &GetStudentName),// 导出全局函数greet()也可以这样写//LUA_REG_FREE_FUNC(greet),// 把两个全局的Add()重载函数导出到lua中def("Add",(int       (*) (int, int))         &Add),  def("Add",(string (*) (string, string))   &Add)// 导出全局变量// 导出枚举//enum_("constants")//(//    value("enStudentType_Little",     enStudentType_Little),  // 小学生//    value("enStudentType_Middle",     enStudentType_Middle),  // 初中生//    value("enStudentType_High",   enStudentType_High),    // 高中生//    value("enStudentType_Big",        enStudentType_Big)      // 大学生//    )];// 导出结构体SScore,虽然SScore是struct,仍要以类的方式进行导出,且需导出构造函数,谨记module(L)[class_<SScore>("SScore")             // 导出类名字"CStudent".def(constructor<>())                 // 导出构造函数.def_readwrite("name",&SScore::name) // 导出可读可写变量.def_readwrite("score",&SScore::score) // 导出可读可写变量];// 导出类CStudentmodule(L)[class_<CStudent>("CStudent")                   // 导出类名字"CStudent".def(constructor<string,int,int,string>())    // 导出构造函数.def("GetName", &CStudent::GetName)          // 导出GetName()函数.def("GetAge", &CStudent::GetAge)         // 导出GetAge()函数// LUA_REG_MEM_FUNC(CStudent, GetAge)        // 导出GetAge()函数也可以这样写// 导出类中的重载函数,注意写法.def("GetScore", (int        (CStudent::*)   (int, int))         &CStudent::GetScore).def("GetScore", (string  (CStudent::*)   (string, string))   &CStudent::GetScore)// 导出类中的属性.def_readonly("m_nID",          &CStudent::m_nID)           // 只读的属性.def_readwrite("m_strNickName", &CStudent::m_strNickName) // 可读可写的属性.def_readwrite("m_score",       &CStudent::m_score)         // 可读可写的属性(结构体类型)// 导出类中的属性,另外一种办法.property("m_nPos",           &CStudent::GetPos, &CStudent::SetPos)  // 导出属性字段m_nPos到lua,用法有点儿类似C#的get,set// 导出类中的枚举,注意写法.enum_("constants")[value("enStateType_Learn",    CStudent::enStateType_Learn),   // 学习状态value("enStateType_Play",  CStudent::enStateType_Play),    // 玩耍状态value("enStateType_Sleep",     CStudent::enStateType_Sleep)    // 睡觉状态]];// 要导出到lua的继承类module(L)[class_<CPeople>("CPeople"),class_<CMan, CPeople>("CMan")  // 标明继承关系,即CMan继承自CPeople// 如果不指定类的继承关系, LuaBind 将不能在相关的继承类型间进行隐式类型转换];return 0;
}// 访问lua中的函数,变量,table等
void TestLua(lua_State* L)
{printf("\n----------   C++开始访问lua中的函数,变量,table     ------------\n");LUA_CODE_BEGIN// 访问lua中的add函数    int nAddResult = luabind::call_function<int>(L,"add", 2, 3);printf("访问lua的全局函数add(),nAddResult = %d\n\n", nAddResult);// 访问lua中的整型全局变量int nValue = luabind::object_cast<int>(luabind::globals(L)["nGlobalValue"]);printf("访问lua的整型全局变量nGlobalValue = %d\n\n", nValue);// 访问lua中的字符串型全局变量string strValue = luabind::object_cast<string>(luabind::globals(L)["strGlobalValue"]);printf("访问lua的字符串型全局变量strGlobalValue = %s\n\n", strValue.c_str());// 访问lua中的table型全局变量// 先获取该tableluabind::object tTable = luabind::globals(L)["globalTable"];printf("访问lua的table型全局变量globalTable\n");// 判断类型是否为tableif (type(tTable) == LUA_TTABLE){// 再获取该table中的字符串型字段string strName = luabind::object_cast<string>(tTable["name"]);printf("访问lua的table型全局变量globalTable中的字段name = %s\n",strName.c_str());// 再获取该table中的整型字段int nAge = luabind::object_cast<int>(tTable["age"]);printf("访问lua的table型全局变量globalTable中的字段age = %d\n\n",nAge);}// 调用尾调用的lua函数,测试堆栈printf("调用lua出错时的堆栈信息\n");printf("可以看到打印出了错误信息 attempt to perform arithmetic on global 'notExistVar' <a nil value>\n");printf("但未能打印出全部的调用堆栈,因为发生了尾调用,堆栈被清空了");luabind::call_function<int>(L,"functionA",12,34);LUA_CODE_END_VOID_RETURN // 由于本函数无返回值,所以用无返回值的宏
}void main()
{//     C++函数,变量,枚举在lua中的测试     ///// 把指定的C++的函数,类,属性,枚举导出到lua中ExportToLua(LUA_VM.pL());// 在lua中访问这些C++的函数,变量,在test.lua中进行测试LUA_VM.do_file("test.lua");/       lua函数,变量,table在C++中的测试      TestLua(LUA_VM.pL());// 结束getchar();
}

特别注意:编译上面的C++代码时需设置宏LUABIND_DYNAMIC_LINK,否则在导出类的属性时会被认为是函数。。。。。

添加预编译宏的方法,如下图所示:

原因见参考:https://stackoverflow.com/questions/14887246/how-to-get-luabind-properties-to-work

lua测试代码如下:


---------------------------------------------------------------     下里是lua访问C++导出的内容  ----------------------------------------------------------------
-- 调用c++中的全局函数
print("call C++ global function")
greet()----------------------------------------------------------------------------------------- 调用C++中的重载函数
print("\ncall C++ Add(int,int) function")
local nResult = Add(11, 88)                                -- 调用int版的Add函数
print("nResult = "..nResult)print("\ncall C++ Add(string,string) function")
local strResult = Add("123", "456")                        -- 调用string版的Add函数
print("strResult = "..strResult)print("\ncall C++ enum")
-- 调用C++中的全局枚举
--print("enStudentType_Little = "..enStudentType_Little)---------------------------------------------------------------------------------------
-- 实例化C++中的类
print("\ncreate a C++ class CStudent")
local student = CStudent("xiaoming", 8, 90, "good")print("\nglobal function param is Class pointer")
local studentName = GetStudentName(student)                -- 调用全局函数(函数参数是对象指针的)
print("GetStudentName = "..studentName)print("\ncall CStudent function")
local nName = student:GetName()                            -- 调用类的一般函数
print("nName = "..nName) local nAge = student:GetAge()                          -- 调用类的一般函数
print("nAge = "..nAge)print("\ncall CStudent::GetScore(int,int) function")
local nScore = student:GetScore(8,9)                   -- 调用类的重载函数int GetScore(int, int)
print("nScore = "..nScore)print("\ncall CStudent::GetScore(string,string) function")
local strScore = student:GetScore("math","music")      --调用类的重载函数string GetScore(string, string)
print("strScore = "..strScore)print("\ncall CStudent::m_nID readonly property")
print(type(student.m_nID))
print(student.m_nID)                                    -- 访问类的只读属性
--student.m_nID = 456                                      -- 修改该属性(这行程序会报错,暂时注释掉,如果打开可看到报错信息"property 'm_nID' is read only")print("\ncall CStudent::m_strNickName readwrite property")
print("student.m_strNickName "..student.m_strNickName)    -- 访问类的可读可写属性
student.m_strNickName = "cat"                            -- 修改该属性
print("student.m_strNickName "..student.m_strNickName)    -- 查看修改结果print("\ncall CStudent::m_score(struct)  readwrite property")
print(student.m_score.name)                             -- 访问类的可读可写属性
print(student.m_score.score)                            -- 访问类的可读可写属性print("\ncall cstudent::m_nPos property")
print("student.m_nPos "..student.m_nPos)              -- 这会触发c++的getpos()
student.m_nPos = 34                                        -- 这会触发c++的setpos()
print("student.m_nPos "..student.m_nPos)print("\ncall CStudent.enStateType_Learn enum")
print("CStudent.enStateType_Learn enum = "..CStudent.enStateType_Learn)  -- 调用类中的枚举(注意写法,类的枚举属于类,不属于类的实例)
CStudent.enStateType_Learn = 987                                       -- 尝试修改C++中的枚举
print("CStudent.enStateType_Learn enum = "..CStudent.enStateType_Learn)  -- 再次打印出来,发现这个枚举值真的被修改了,无语。。。。---------------------------------------------------------------     下面是C++访问lua的内容     -------------------------------------------------------------------
-- 全局函数
function add(nNum1, nNum2)return nNum1 + nNum2
end-- 整型全局变量
nGlobalValue = 54321-- 字符串型全局变量
strGlobalValue = "test global value"-- table型全局变量
globalTable =
{name = "xiaohong",age = 6,
}-- 测试lua出错时打印出调用堆栈
function functionA(nNum)return functionB(nNum)
endfunction functionB(nNum)return functionC(nNum)
endfunction functionC(nNum)return notExistVar+nNum     -- 访问一个不存在的变量
end

测试结果如下:

luabind-0.9.1在windows、linux下的使用详解及示例相关推荐

  1. Linux下top命令详解

    Linux下top命令详解 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来不断刷 ...

  2. linux系统rar命令行,Linux下rar命令详解

    Linux下rar命令详解 发布时间:2010-05-24 23:28:23   作者:佚名   我要评论 通常rar命令由一个主命令加若干选项(可选)构成,操作文档为操作施加的.rar文件对象,文件 ...

  3. linux下DNS配置详解

    linux下DNS配置详解 DNS 是域名系统 (Domain Name Server) 的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务.在Internet上域名与IP地址之间是一一对应的 ...

  4. linux看不到进程管理,关于Linux下进程的详解【进程查看与管理】

    关于Linux下进程的详解[进程查看与管理] 一.关于进程 进程: 已经启动的可执行程序的运行实力 进程的组成:一个进程包含内核中的一部分地址空间和一系列数据结构.其中地址空间是内核标记的一部分内存以 ...

  5. Linux下的时间详解【转】

    Linux下的时间详解 [转载]http://www.fangshanzi.com/linux-time-function-detail/ 1.首先来总结一下hwclock,这个容易晕: 1)/etc ...

  6. linux中top指令,Linux下top命令详解

    原标题:Linux下top命令详解 1.简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top显示系统当前的进程和其他状况 ...

  7. Linux下使用aMsn详解(转)

    Linux下使用aMsn详解(转) amsn这一款在linux下的Msn就不多介绍了,0.95版出来后加入了摄像头,在加上其文件传输功能,你还留恋于gaim么? 经过多天的搜索和尝试,终于在Fedor ...

  8. linux下readlink函数详解

    linux下readlink函数详解 相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:int  readlink(con ...

  9. linux cat命令缩写,linux下cat命令详解

    cat 能够一同显现多个文件的内容,比方咱们能够在一个cat指令上一同显现两个文件的内容;那么你知道linux下cat命令详解么?接下来是小编为大家收集的linux下cat命令详解,欢迎大家阅读: l ...

最新文章

  1. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
  2. docker加速器,设置cdn
  3. tab in English
  4. ASP.NET Core微服务(二)——【ASP.NET Core Swagger配置】
  5. C++多线程实例(_beginThreadex创建多线程)
  6. 元祖python_python---tuple元祖
  7. python3中format函数列表_Python3之字符串格式化format函数详解(上)
  8. 高大上的集团名字_那些刚改了“高大上”名字的学校,你知道都有哪些吗?蜻蜓AI小编来帮你科普一下...
  9. php thumb 生成缩略图
  10. python基础学习笔记——异常处理
  11. 控件中数据模板禁用小键盘减号折叠
  12. Linux下如何手动搭建论坛?
  13. 酷应用,这个小玩意为中国软件业趟出了一条新路
  14. 广州打捞局成功救助7名遇险人员
  15. react package.json 修改proxy进行前端跨域,通过修改homepage,更改打包路径
  16. 商业研究(17):以小见大,看互联网经济(4个股权众筹平台,4个领域,10个项目,8个图)
  17. c语言里的u代表什么_c语言中的 %u 什么意思啊?
  18. 复杂 Excel 表格导入导出的最简方法
  19. QCOM 8976 porting SPI device
  20. IntelliJ IDEA必会的几个常用设置

热门文章

  1. 在Linux服务器之间迁移帐号信息
  2. 语言的进步与代码生成
  3. cocos工程里面“”invalid ''cobl” in fuction xxx原理与解决方案
  4. HDU - 5157 Harry and magic string(回文自动机)
  5. PAT (Advanced Level) 1010 Radix(二分+模拟)
  6. python学全栈还是运维_Python全栈学习——Python基础及Web开发
  7. SGU247(排列组合与大数运算)
  8. Rust学习资料大全
  9. 【玩转cocos2d-x之三十二】xml的解析
  10. Ubuntu LXC