Lua教程(一):在C++中嵌入Lua指令碼_Lua

來源:互聯網
上載者:User

本系列教程主要介紹如何在C/C++程式裡面嵌入Lua指令碼,我打算從以下幾個方面來介紹:

1.如何在C/C++裡面嵌入Lua指令碼

2.Lua訪問C/C++資料結構(這裡面要介紹類,結構體,函數,變數,枚舉等資料類型在lua裡面如何訪問)

3.C/C++訪問Lua的資料,主要是基礎資料型別 (Elementary Data Type),函數和Table

4.Cocos2D-X裡面的Lua綁定(含自動綁定與手動綁定)

5.Cocos2D-x裡面Lua和C/C++相互調用

6.Cocos2D-x裡面Lua和Java相互調用

7.Cocos2D-x裡面Lua和Objective-C相互調用

本系列教程不會過多地介紹Lua的基本文法,關於Lua基本文法的學習,推薦《Programming In Lua》。 如有紕漏,歡迎指出,謝謝。

另外,關於更新時間,每周一篇,定期或者不定期,呵呵。

Mac項目整合Lua

準備工作

首先,建立一個控制台應用程式。 開啟Xcode,New->Project->OSX->Command Line Tool,取名為Lesson01如下圖所示:

接下來,我們需要下載lua5.2.3.下載完後,解壓縮,然後cd到剛剛解壓縮的路徑下面,輸入make macosx,這樣便可以產生Mac下面的lib檔案。

接下來把剛剛解壓縮的檔案夾拷貝到你建立的工程下面,然後設定include路徑和library路徑。(注意,這裡是不需要把標頭檔添加到Xcode裡面的,只要指定include路徑,編譯的時候,編譯器會自動去找的。)

因為我的Lua檔案夾的路徑是:xxxx/Lesson01/lua-5.2.3,所以,我把search path和library path分別設定為:

複製代碼 代碼如下:

//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,並包含以下標頭檔:

複製代碼 代碼如下:

#include "lua.hpp"

如果此時編譯不報錯,則說明你之前設定的search path是正確的,如果報錯,請自行調整search path。

這裡面的lua.hpp的內容如下:

複製代碼 代碼如下:

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

這才是大多數Lua教程裡的代碼嘛。然後在main函數裡面添加以下內容:

複製代碼 代碼如下:

/1. 初始化Lua虛擬機器
lua_State *lua_state;
lua_state = luaL_newstate();
//2.設定待註冊的Lua標準庫,這個庫是給你的Lua指令碼用的
//因為接下來我們只想在Lua指令碼裡面輸出hello world,所以只引入基本庫就可以了
static const luaL_Reg lualibs[] =
{
    { "base", luaopen_base },
    { NULL, NULL}
};
//3.註冊Lua標準庫並清空棧
const luaL_Reg *lib = lualibs;
for(; lib->func != NULL; lib++)
{
    luaL_requiref(lua_state, lib->name, lib->func, 1);
    lua_pop(lua_state, 1);
}
//4、運行hello.lua指令碼
luaL_dofile(lua_state, "hello.lua");
//5. 關閉Lua虛擬機器
lua_close(lua_state);

建立Lua檔案

選擇New->File->Other,然後命名為hello.lua, 以下是hello.lua裡面的內容:

複製代碼 代碼如下:

print "Hello World"

編譯並運行

此時編譯並運行,這時可能看不到控制台輸出”Hello World”。因為你的Lua指令碼沒有拷貝到程式裡面去,我們需要再設定一下。如下圖所示: (注意:subpath要清空,copy only when installing去掉打勾)

這時,編譯並運行,你會得到如下結果 :

接下來,我們講講IOS項目怎麼整合Lua。

IOS項目整合Lua

IOS項目整合Lua的方式與Mac大同小異,順便補充一句,Lua本質上是一個c程式,任何平台下面整合相應c庫的方法都是適用的。

這裡我主要寫一些注意事項吧:

1.我們剛才編譯好的macosx庫只能給mac程式用,ios需要單獨編譯(當然,windows和linux也需要再單獨編譯,編譯方法見下載的lua-5.2.3/doc/readme.html)

2.編譯ios可以通過添加一個static library,然後把所有的Lua檔案添加到這個Library裡面。最後,讓主專案依賴這個Library就可以了。

3.直接使用luaL_dofile(lua_state, “hello.lua”)是行不通的,因為ios項目的資源路徑在一個沙箱裡。我們必須取得全路徑才可以訪問到這個hello.lua檔案。以cocos2d-x為例,我們可以使用下面的代碼獲得hello.lua的全路徑,然後再傳遞給Lua虛擬機器。

複製代碼 代碼如下:

  std::string scriptPath = FileUtils::getInstance()->fullPathForFilename("hello.lua");
    int status = luaL_loadfile(lua_state, scriptPath.c_str());

Android項目整合Lua

Android整合Lua需要使用Android.mk把Lua打包成一個靜態庫,然後在項目裡麵包含這個Lua模組。具體的做法可以參考cocos2d-x。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.