Lua腳本是一種可用於C程序開發/測試的工具,本篇介紹一下C程序與Lua腳本如何進行相互調用,更加詳細的操做參見《Programing in Lua》。本文分爲3個部分:一、Windows環境下Lua的下載以及安裝注意事項;二、Visual C++6.0中Lua的配置;三、C程序與Lua腳本相互調用實例。redis
一、Windows環境下Lua的下載以及安裝注意事項windows
a、下載Lua for Windows,筆者用的版本是V5.1.4-35;編輯器
b、上微軟官網,下載Visual C++運行庫——vcredist_x86.exe;
ide
c、將LuaForWindows_v5.1.4-35.exe和vcredist_x86.exe放在同一目錄下,直接點擊LuaForWindows_v5.1.4-35.exe,安裝便可,建議將Lua安裝在D盤根目錄下;函數
d、安裝成功以後,使用Lua目錄下SciTE編輯器,就能夠編寫lua腳本,點擊「執行」按鈕,就能夠查看執行結果。工具
二、Visual C++6.0中Lua的配置測試
a、新建一個工程LuaMutualCallCMethod,選擇Tools--->Options--->Directories,配置VC++的目錄項:google
(1)Include files,添加「D:\LUA\5.1\INCLUDE」;lua
(2)Library files,添加「D:\LUA\5.1\LIB」;spa
(3)Executable files,添加「D:\LUA\5.1」;
b、配置工程的連接屬性,選擇Project--->Setting---->Link,添加lua5.1.lib;
三、C程序與Lua腳本相互調用實例
a、C程序調用Lua腳本
(1)建立Lua數據腳本data.lua
length = 5 width = 10 heigth = 20
(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); }
(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)
(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: 一、建立Lua狀態; 二、打開Lua標準庫 三、註冊供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; }
(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); }
(4)輸出結果
The Print Data is 30