zoukankan      html  css  js  c++  java
  • C++中嵌入Lua脚本环境搭建

    第一步(环境准备工作):

    工具:

    ●LuaForWindows_v5.1.4-46.exe傻瓜式安装。

      作用:此工具可以在windows环境下编译运行Lua脚本程序。安装完成后会有两个图标:LuaSciTELua是命令行,SciTE是图形运行环境,两个都可以编译运行,看个人喜好。

    ●VS2012大家都会,此处省略若干字...

     

    第二步(在VS2012下新建并运行C++中嵌入Lua脚本程序):

    ●打开VS2012,新建一个控制台的C++空项目

    ●配置Lua的安装路径和引用相关Lua库

      1、右击新创建的工程,属性-->配置属性-->VC++目录:

           可执行文件目录:C:Program Files (x86)Lua5.1(LuaForWindows安装目录

           包含目录:C:Program Files (x86)Lua5.1include

       库目录:C:Program Files (x86)Lua5.1lib

     

      2、右击新创建的工程,属性-->配置属性-->链接器:所有选项

       附加依赖项:lua51.lib lua5.1.lib(将此两项导入进去)(如果编译出错直接填写路径)

       #pragma comment(lib,"lua5.1.lib" )  这一步可以换成在代码中加入这个

    第三步(万事俱备,只欠东风):

    ●在你的空项目中,新建一个.cpp源文件,编写测试代码。下面提供一个例子供新手测试。

    ●因为本人还不太熟悉Lua脚本的语法,更不会在C++中使用Lua啦,这里直接从网上借用了一下别人的,程序如下:

     

     

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

    extern "C"
    {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    }


    lua_State *L;
    double fun( double x, double y )
    {
    double ret;
    lua_getglobal( L, "add"); // 获取全局变量f
    lua_pushnumber( L,x); // 操作数压栈
    lua_pushnumber( L,y); // 操作数压栈
    lua_call( L, 2, 1); // 执行:2个操作数,1个返回值
    //lua_pcall( L, 2, 1, 0); // 保护模式的lua_call,0为错误处理码。具体应用暂时不明,在使用手册中有粗略介绍
    ret = lua_tonumber( L, -1); // 将栈顶元素转换成数字并赋值给ret
    lua_pop( L, 1); // 从栈中弹出一个元素
    return ret;
    }


    static int average(lua_State *L2)
    {
    /**//* get number of arguments */
    int n = lua_gettop(L2);
    double sum = 0;
    int i;
    /**//* loop through each argument */
    for (i = 1; i <= n; i++)
    {
    /**//* total the arguments */
    sum += lua_tonumber(L2, i);
    }
    lua_pushnumber(L, sum / n);
    /**//* push the sum */
    lua_pushnumber(L, sum);
    /**//* return the number of results */
    printf("average called. [ok] ");
    return 2;
    }


    int _tmain(int argc, _TCHAR* argv[])
    {

    int error;
    L = lua_open(); // 创建Lua接口指针(借用DX的术语,本质是个堆栈指针)
    luaopen_base(L); // 加载Lua基本库
    luaL_openlibs(L); // 加载Lua通用扩展库


    lua_register(L, "average", average);
    error = luaL_dofile(L, "hellow.lua"); // 读取Lua源文件到内存编译

    double ret = fun( 10, 3.4); // 调用模版函数f
    printf( "ret = %f ", ret); // 输出结果,C语言的东西,跟Lua无关
    lua_close( L);


    int a ;
    cin>>a;
    return 0;
    }

    hellow.lua 文件(放在main.cpp 同级目录)

    function add ( x, y)
    file = assert(io.open("data.txt", "w"))
    file:write("abcde ")
    file:write("ok! ")
    file:close()

    --DataDumper(1,2,3,4)
    file = assert(io.open("data.txt", "r"))
    str = file:read("*a")
    io.write(str)
    io.write(" ")

    avg, sum = average(10, 200, 3000)
    print("The average is ", avg)
    print("The sum is ", sum)

    return x + y
    end

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

    extern "C" {
    #include "lua.h"
    #include <lauxlib.h>
    #include <lualib.h>
    }

    #pragma comment(lib,"lua5.1.lib")  
    int main (void)
    {
    lua_State *L = lua_open(); /* 打开 Lua */
    luaL_openlibs(L); /* 加载 .lib 文件 */

    // 加载脚本文件,需要放在程序目录
    luaL_loadfile( L, "test.lua" );    
    lua_resume( L, 0 );
    // 调用【ShowIm】函数
    lua_getglobal( L, "ShowIm" );
    if( lua_resume( L, 0 ) )
    printf( "%s/n", lua_tostring( L, 1 ) );
    // 调用结束
    lua_close(L);

    system("pause");

    return 0;
    }

    function ShowIm()
    print( " Hello , I'm Sollyu . I like this code ." )
    end

  • 相关阅读:
    时间计算
    DateTime
    C# trim split dataGrid
    something
    生活
    如何导入外部的源码到eclipse中
    java类中获取ServletContext的方法
    获取spring容器上下文(webApplicationContext)的几种方法
    java反射(转)
    mysql常见命令
  • 原文地址:https://www.cnblogs.com/cci8go/p/3902612.html
Copyright © 2011-2022 走看看