• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua与C++交互初探之C++调用Lua

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
Lua与C++交互初探之C++调用Lua

自从学习了lua这个脚本语言之后,无时不想着将他与c/c++联系起来,看看他真正的威力。奈何水平有限,网上找的代码无论怎样都无法运行成功。我知道是我少了某一步但是又不知道到底少了什么,于是就在各大博客、网站、论坛不断的摸索测试。我也不知道花了多长时间。总之在今天测试成功了。我把我测试遇到的问题和解决过程贴出来供大家参考。

 一、lua环境的搭建

  1. 建议去网上下载luaforwindow,这是一款跟众多window系统的软件一样,安装起来简单方便,一路点next就能搞定了。而且他还包含了有用的与lua有关的基本工具

    他包括以下组件:

    Lua(Command Line):lua的一个命令行编辑器。简单轻便,习惯命令行编(zhuang)辑(bi)的可以试试。

    Lua Examples: 包含lua使用的一些例子。

    LuaForWindows Documentation :LuaForWindows这款软件的一些说明

    QuickLuaTour : lua快速入门向导,没什么用,看看就好

    SciTE:lua的一个不错的文本编辑器。可以在里面测试一些lua代码,可以运行测试。前提是要先保存文件在运行,否则他没有任何反应。别问我是怎么知道的,心塞塞

    Documentation:里面包含lua的帮助文档,最有用的就是他了吧。

     

     

    安装好后Lua的环境就算是搭建好了。我们用命令行简单来测试一下:

Ok,木有问题

 

 二、VS环境配置

  1. 这一步是最重要的,一开始我是去lua官网下载的源文件再把他们添加到vs项目,虽然编译是没有问题了,但是在测试运行的时候链接还是出现了问题。很明显我是少了什么东东。后来我改用下面的方法解决了问题。

    1. 选中项目,右键->属性->定位到VC++目录项

    1. 在"可执行文件目录"里添加上lua的安装目录。过程如下:

      定位到Lua的安装文件夹,我的是:

       

      确定后返回

       

       

    2. 用同样的步骤,将"lua安装目录\5.1\include"添加到"包含目录";
    3. 将"lua安装目录\5.1\lib"添加到"库目录";
    4. 跳到"连接器"的"输入"栏。将"附加依赖项"中添加上"lua51.lib;lua5.1.lib";

     

     

    至此环境基本就配置好了。类似下面:

    现在我们用代码测试一遍:

#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
void main()
{
    //1.创建一个state
    lua_State *L = luaL_newstate();
    //2.入栈操作
    lua_pushstring(L, "Hello World~");
    //3.取值操作
    if (lua_isstring(L, 1)) { //判断是否可以转为string
        cout << lua_tostring(L, 1) << endl; //转为string并返回
    }
    //4.关闭state
    lua_close(L);
    system("pause");
    return;
} 

 

 

是不是木有问题啦╮(╯▽╰)╭

喏,我们亲爱的World君

 

  1. Lua与C++的交互测试

    上面我们已经把需要的环境什么的都配置好了,现在重头戏上场( ̄︶ ̄)

    1. 我们建一个test.lua文件;
    function Communicate(name)
    return ("Hello "..name..", I`m in Lua");
    end

     


    1. 我们调用lua文件的cpp代码

    

#include "stdafx.h"
#include <iostream>  
#include <string.h>  
using namespace std;

extern "C"
{
#include "lua.h"  
#include "lauxlib.h"  
#include "lualib.h"  
}
void main()
{
    string hello = "This is Zack, I`m in C++";
    cout << hello.c_str() << endl;
    //创建Lua状态  
    lua_State *L = luaL_newstate();
    if (L == NULL)
    {
        return;
    }

    //加载Lua文件  
    int bRet = luaL_loadfile(L, "test.lua");
    if (bRet)
    {
        cout << "load file error" << endl;
        return;
    }

    //运行Lua文件  
    bRet = lua_pcall(L, 0, 0, 0);
    if (bRet)
    {
        cout << "pcall error" << endl;
        return;
    }
                                      //读取函数  
    lua_getglobal(L, "Communicate");        // 获取函数,压入栈中  
    lua_pushstring(L, "Zack");          // 压入参数  
    int iRet = lua_pcall(L, 1, 1, 0);// 调用函数,调用完成以后,会将返回值压入栈中,第一个1表示参数个数,第二个1表示返回结果个数。  
    if (iRet)                       // 调用出错  
    {
        const char *pErrorMsg = lua_tostring(L, -1);
        cout << pErrorMsg << endl;
        lua_close(L);
        return;
    }
    if (lua_isstring(L, -1))        //取值输出  
    {
        string Result = lua_tostring(L, -1);
        cout << Result.c_str() << endl;
    }

    //关闭state  
    lua_close(L);
    system("pause");
    return;
}

 

结果:

 

 

嗯,大功告成。就酱紫了╰( ̄▽ ̄)╮╭(′▽`)╯╰( ̄▽ ̄)╮


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Cocos-2dx-Lua中使用Luaj的完整示例(转)发布时间:2022-07-22
下一篇:
cocos2d lua 播放动画功能发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap