Lua與C++交互初探之C++調用Lua
自從學習了lua這個腳本語言之后,無時不想着將他與c/c++聯系起來,看看他真正的威力。奈何水平有限,網上找的代碼無論怎樣都無法運行成功。我知道是我少了某一步但是又不知道到底少了什么,於是就在各大博客、網站、論壇不斷的摸索測試。我也不知道花了多長時間。總之在今天測試成功了。我把我測試遇到的問題和解決過程貼出來供大家參考。
一、lua環境的搭建
-
建議去網上下載luaforwindow,這是一款跟眾多window系統的軟件一樣,安裝起來簡單方便,一路點next就能搞定了。而且他還包含了有用的與lua有關的基本工具
他包括以下組件:
Lua(Command Line):lua的一個命令行編輯器。簡單輕便,習慣命令行編(zhuang)輯(bi)的可以試試。
Lua Examples: 包含lua使用的一些例子。
LuaForWindows Documentation :LuaForWindows這款軟件的一些說明
QuickLuaTour : lua快速入門向導,沒什么用,看看就好
SciTE:lua的一個不錯的文本編輯器。可以在里面測試一些lua代碼,可以運行測試。前提是要先保存文件在運行,否則他沒有任何反應。別問我是怎么知道的,心塞塞
Documentation:里面包含lua的幫助文檔,最有用的就是他了吧。
安裝好后Lua的環境就算是搭建好了。我們用命令行簡單來測試一下:
Ok,木有問題
二、VS環境配置
-
這一步是最重要的,一開始我是去lua官網下載的源文件再把他們添加到vs項目,雖然編譯是沒有問題了,但是在測試運行的時候鏈接還是出現了問題。很明顯我是少了什么東東。后來我改用下面的方法解決了問題。
-
選中項目,右鍵->屬性->定位到VC++目錄項
-
在"可執行文件目錄"里添加上lua的安裝目錄。過程如下:
定位到Lua的安裝文件夾,我的是:
確定后返回
-
用同樣的步驟,將"lua安裝目錄\5.1\include"添加到"包含目錄";
-
將"lua安裝目錄\5.1\lib"添加到"庫目錄";
-
跳到"連接器"的"輸入"欄。將"附加依賴項"中添加上"lua51.lib;lua5.1.lib";
至此環境基本就配置好了。類似下面:
現在我們用代碼測試一遍:
-
#include "stdafx.h" #include <iostream> #include <string.h> using namespace std; extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } void main() { //1.創建一個state lua_State *L = luaL_newstate(); //2.入棧操作 lua_pushstring(L, "Hello World~"); //3.取值操作 if (lua_isstring(L, 1)) { //判斷是否可以轉為string cout << lua_tostring(L, 1) << endl; //轉為string並返回 } //4.關閉state lua_close(L); system("pause"); return; }
是不是木有問題啦╮(╯▽╰)╭
-
Lua與C++的交互測試
上面我們已經把需要的環境什么的都配置好了,現在重頭戲上場( ̄︶ ̄)
-
我們建一個test.lua文件;
function Communicate(name) return ("Hello "..name..", I`m in Lua"); end
-
我們調用lua文件的cpp代碼
-
#include "stdafx.h" #include <iostream> #include <string.h> using namespace std; extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } void main() { string hello = "This is Zack, I`m in C++"; cout << hello.c_str() << endl; //創建Lua狀態 lua_State *L = luaL_newstate(); if (L == NULL) { return; } //加載Lua文件 int bRet = luaL_loadfile(L, "test.lua"); if (bRet) { cout << "load file error" << endl; return; } //運行Lua文件 bRet = lua_pcall(L, 0, 0, 0); if (bRet) { cout << "pcall error" << endl; return; } //讀取函數 lua_getglobal(L, "Communicate"); // 獲取函數,壓入棧中 lua_pushstring(L, "Zack"); // 壓入參數 int iRet = lua_pcall(L, 1, 1, 0);// 調用函數,調用完成以后,會將返回值壓入棧中,第一個1表示參數個數,第二個1表示返回結果個數。 if (iRet) // 調用出錯 { const char *pErrorMsg = lua_tostring(L, -1); cout << pErrorMsg << endl; lua_close(L); return; } if (lua_isstring(L, -1)) //取值輸出 { string Result = lua_tostring(L, -1); cout << Result.c_str() << endl; } //關閉state lua_close(L); system("pause"); return; }
結果:
嗯,大功告成。就醬紫了╰( ̄▽ ̄)╮╭(′▽`)╯╰( ̄▽ ̄)╮