讀後感悟:先講了環境了配置,然後著重講了c++中如何呼叫lua,適合入門。如果想學習語法,可以看《lua程式設計》,雖然講的是lua5.1,但是很多語法還是可以學的。當你學會了最基本的c++與lua呼叫之後,就可以馬上學一些互動**了,而不是只是看書,那麼看了之後,你會很容易忘記的,之前我就是學習lua的時候就是很少敲**的,所以現在都忘了很多了,程式設計師還是多寫寫**。
本系列教程主要介紹如何在c/c++程式裡面嵌入lua指令碼,我打算從以下幾個方面來介紹:
本系列教程不會過多地介紹lua的基本語法,關於lua基本語法的學習,推薦《programming in lua》。 如有紕漏,歡迎指出,謝謝。
mac專案整合lua
準備工作
首先,新建乙個控制台應用程式。 開啟xcode,new->project->osx->command line tool,取名為lesson01如下圖所示:
接下來把剛剛解壓縮的資料夾拷貝到你新建的工程下面,然後設定include路徑和library路徑。(注意,這裡是不需要把頭檔案新增到xcode裡面的,只要指定include路徑,編譯的時候,編譯器會自動去找的。)
因為我的lua資料夾的路徑是:***x/lesson01/lua-5.2.3,所以,我把search path和library path分別設定為:
[html]
view plain
copy
//search path
$(srcroot)/lesson01/lua-5.2.3/src/
//library path
$(project_dir)/lesson01
下面是我的工程與lua之間的目錄結構,liblua.a檔案是從src裡面拷貝出來的。(前面我們使用make macosx生成出來的)
注意:如果直接新增lua的所有原始碼,則會編譯報錯。因為lua.c裡面也有乙個main函式。這個main函式是用來生成可執行程式的。另外,如果是新增其它第三方的庫,也可以參考這個方法,新增search path和library path。
c++呼叫lua檔案
首先,開啟main.cpp,幷包含以下標頭檔案:
[cpp]
view plain
copy
#include "lua.hpp"
如果此時編譯不報錯,則說明你之前設定的search path是正確的,如果報錯,請自行調整search path。
這裡面的lua.hpp的內容如下:
[cpp]
view plain
copy
extern
"c"
這才是大多數lua教程裡的**嘛。然後在main函式裡面新增以下內容:
[cpp]
view plain
copy
//1. 初始化lua虛擬機器
lua_state *lua_state;
lua_state = lual_newstate();
//2.設定待註冊的lua標準庫,這個庫是給你的lua指令碼用的
//因為接下來我們只想在lua指令碼裡面輸出hello world,所以只引入基本庫就可以了
static
const
lual_reg lualibs =
,
};
//3.註冊lua標準庫並清空棧
const
lual_reg *lib = lualibs;
for(; lib->func != null; lib++)
//4、執行hello.lua指令碼
lual_dofile(lua_state, "hello.lua"
);
//5. 關閉lua虛擬機器
lua_close(lua_state);
新建lua檔案
選擇new->file->other,然後命名為hello.lua, 以下是hello.lua裡面的內容:
[cpp]
view plain
copy
"hello world"
編譯並執行
此時編譯並執行,這時可能看不到控制台輸出"hello world"。因為你的lua指令碼沒有拷貝到程式裡面去,我們需要再設定一下。如下圖所示:
這時,編譯並執行,你會得到如下結果 :
接下來,我們講講ios專案怎麼整合lua。
ios專案整合lua
ios專案整合lua的方式與mac大同小異,順便補充一句,lua本質上是乙個c程式,任何平台下面整合相應c庫的方法都是適用的。
這裡我主要寫一些注意事項吧:
編譯ios可以通過新增乙個static library,然後把所有的lua檔案新增到這個library裡面。最後,讓主專案依賴這個library就可以了。
直接使用lual_dofile(lua_state, "hello.lua")是行不通的,因為ios專案的資源路徑在乙個沙盒裡。我們必須取得全路徑才可以訪問到這個hello.lua檔案。以cocos2d-x為例,我們可以使用下面的**獲得hello.lua的全路徑,然後再傳遞給lua虛擬機器。
[cpp]
view plain
copy
std::string scriptpath = fileutils::getinstance()->fullpathforfilename(
"hello.lua"
);
intstatus = lual_loadfile(lua_state, scriptpath.c_str());
android專案整合lua
android整合lua需要使用android.mk把lua打包成乙個靜態庫,然後在專案裡面包含這個lua模組。具體的做法可以參考cocos2d-x。
reference
running a lua 5.2 script from c++
lua sample code
getting started with lua
推薦閱讀:
cocos2d-x中lua 繫結的檔案結構
C 嵌入lua指令碼
現時遊戲開發裡比較多使用一門伺服器開發語言 指令碼作為開發,在此僅記錄c 嵌入 lua指令碼的過程 環境 mac,10.11.6 2.新建xcode 專案 4.解壓完畢之後,切入lua 5.x.x裡,執行make macosx,生成liblua.a檔案 5.配置路徑 選中project build ...
lua解析lua指令碼
lua中使用loadstring可以直接以字串形式執行 loadfile可以直接解析 為lua function.如果乙個lua資料檔案有結尾返回例如 return sound 則可以直接使用 dofile來執行檔案,執行結果就是sound table。如果lua資料檔案沒有返回值,dofile不可...
Lua教程(二十) Lua呼叫C函式
lua可以呼叫c函式的能力將極大的提高lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過c函式來實現,之後再通過lua呼叫指定的c函式。對於那些可被lua呼叫的c函式而言,其介面必須遵循lua要求的形式,即typedef int lua cfun...