Lua教程 C 嵌入Lua指令碼

2021-08-20 16:31:41 字數 3012 閱讀 5031

讀後感悟:先講了環境了配置,然後著重講了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

print 

"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...