歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C程序與Lua腳本相互調用

  Lua腳本是一種可用於C程序開發/測試的工具,本篇介紹一下C程序與Lua腳本如何進行相互調用,更加詳細的操作參見《Programing in Lua》。本文分為3個部分:1、Windows環境下Lua的下載以及安裝注意事項;2、Visual C++6.0中Lua的配置;3、C程序與Lua腳本相互調用實例。

Lua程序設計 Programming in Lua 中文 PDF 高清版 下載:http://www.linuxidc.com/Linux/2015-05/117362.htm

  1、Windows環境下Lua的下載以及安裝注意事項

  a、下載Lua for Windows,筆者用的版本是V5.1.4-35;

  b、上微軟官網,下載Visual C++運行庫——vcredist_x86.exe;

  c、將LuaForWindows_v5.1.4-35.exe和vcredist_x86.exe放在同一目錄下,直接點擊LuaForWindows_v5.1.4-35.exe,安裝即可,建議將Lua安裝在D盤根目錄下;

  d、安裝成功之後,使用Lua目錄下SciTE編輯器,就可以編寫lua腳本,點擊“執行”按鈕,就可以查看執行結果。

  

  2、Visual C++6.0中Lua的配置

  a、新建一個工程LuaMutualCallCMethod,選擇Tools--->Options--->Directories,配置VC++的目錄項:

  (1)Include files,添加“D:\LUA\5.1\INCLUDE”;

  (2)Library files,添加“D:\LUA\5.1\LIB”;

  (3)Executable files,添加“D:\LUA\5.1”;

  b、配置工程的鏈接屬性,選擇Project--->Setting---->Link,添加lua5.1.lib;

  3、C程序與Lua腳本相互調用實例

  a、C程序調用Lua腳本

  (1)創建Lua數據腳本data.lua  

length = 5
width = 10
heigth = 20
View Code

  (2)創建C程序main.c,讀取test.lua中的數據,並打印輸出  

#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

void main()
{
    int retCode;
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    retCode = luaL_dofile(L,"data.lua");
    if (retCode != 0)
    {
        printf("error %s\n",lua_tostring(L,-1));
        return;
    }
    lua_getglobal(L,"length");
    lua_getglobal(L,"width");
    lua_getglobal(L,"heigth");

    printf("length=%d\n",lua_tointeger(L,-3));
    printf("width=%d\n",lua_tointeger(L,-2));
    printf("heigth=%d\n",lua_tointeger(L,-1));

    lua_close(L);
}
View Code

  (3)輸出結果

      length = 5

      width = 10

      height = 20

 

  b、Lua腳本調用C程序中的函數

  (1)創建Lua執行腳本compute.lua

sum = 0
firstPara = 20
secondPara = 10

sum = addMethod(firstPara,secondPara)

printMethod(sum)
View Code

  (2)創建C程序CMethodForLua.c,編寫與“addMethod”、“printMethod”相對應的C函數,並將其“注冊”到Lua環境中;

#include <stdio.h>
#include "CmethodForLua.h"

/**********************************************************************
    Fuction:        Lua_AddMethod
    Description:    供Lua調用的加法運算

    Parameter:        luaEnv        --[in]    lua執行環境            

    Return Value:    數字    lua執行後返回參數

    Note:            

    Other:            內部函數,僅供CmethodForLua.c調用


 *********************************************************************/
static int Lua_AddMethod(lua_State *luaEnv)
{
    double firstPara = luaL_checknumber(luaEnv,1);
    double secondPara = luaL_checknumber(luaEnv,2);
    lua_pushnumber(luaEnv,firstPara+secondPara);
    return 1;
}

/**********************************************************************
    Fuction:        Lua_PrintMethod
    Description:    供Lua調用的打印運算

    Parameter:        luaEnv        --[in]    lua執行環境            

    Return Value:    數字    lua執行後返回參數

    Note:            

    Other:            內部函數,僅供CmethodForLua.c調用


 *********************************************************************/
static int Lua_PrintMethod(lua_State *luaEnv)
{
    int printData = (int)luaL_checknumber(luaEnv,1);
    printf("The Print Data is %d\n",printData);
    return 0;
}


/**********************************************************************
    Fuction:        OpenLuaExecuteEnvironment
    Description:    打開Lua執行環境

    Parameter:        luaEnv        --[in/out]    lua執行環境    

    Return Value:    0    執行成功
                    非0    執行失敗,錯誤碼

    Note:            
    1、創建Lua狀態;
    2、打開Lua標准庫
    3、注冊供Lua調用的C函數;

    Other:            


 *********************************************************************/
int OpenLuaExecuteEnvironment(lua_State **luaEnv)
{
    lua_State *L = NULL;
    L = luaL_newstate();
    luaL_openlibs(L);
    lua_register(L,"addMethod",Lua_AddMethod);
    lua_register(L,"printMethod",Lua_PrintMethod);
    *luaEnv = L;
    return LUA_SUCCESS;
}

/**********************************************************************
    Fuction:        CloseLuaExecuteEnvironment
    Description:    關閉Lua執行環境

    Parameter:        luaEnv        --[in]    lua執行環境    

    Return Value:    0    執行成功
                    非0    執行失敗,錯誤碼

    Note:            

    Other:            


 *********************************************************************/
int CloseLuaExecuteEnvironment(lua_State *luaEnv)
{
    lua_close(luaEnv);
    return LUA_SUCCESS;
}
View Code

  (3)創建main.c,獲取CMethodForLua.c中的Lua執行環境,並執行compute.lua腳本

#include <stdio.h>
#include"CmethodForLua.h"

void main()
{
    lua_State*luaEnv = NULL;
   int retCode;
    retCode= OpenLuaExecuteEnvironment(&luaEnv);
   if (retCode != LUA_SUCCESS)
    {
       return;
    }
   
   //Lua調用C語言函數,   
    retCode = luaL_dofile(luaEnv,"compute.lua");
   if (retCode != LUA_SUCCESS) { printf("error %s\n",lua_tostring(luaEnv,-1));
       return;
    }

    CloseLuaExecuteEnvironment(luaEnv);
}View Code

  (4)輸出結果

    The Print Data is 30

Lua 語言 15 分鐘快速入門 http://www.linuxidc.com/Linux/2013-06/86582.htm

Lua程序設計(第2版)中文 PDF http://www.linuxidc.com/Linux/2013-03/81833.htm

Lua程序設計(第二版)閱讀筆記 http://www.linuxidc.com/Linux/2013-03/81834.htm

NetBSD 將支持用 Lua 腳本開發內核組件 http://www.linuxidc.com/Linux/2013-02/79527.htm

CentOS 編譯安裝 Lua LuaSocket http://www.linuxidc.com/Linux/2011-08/41105.htm

Lua 的詳細介紹:請點這裡
Lua 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved