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 = 20View 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>(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 的下載地址:請點這裡