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