欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Lua教程(一):在C++中嵌入Lua腳本

 更新時(shí)間:2014年09月22日 11:33:44   投稿:junjie  
這篇文章主要介紹了Lua教程(一):在C++中嵌入Lua腳本,本文在MAC環(huán)境中開發(fā),同時(shí)探討了IOS項(xiàng)目集成Lua、Android項(xiàng)目集成Lua等內(nèi)容,需要的朋友可以參考下

本系列教程主要介紹如何在C/C++程序里面嵌入Lua腳本,我打算從以下幾個(gè)方面來(lái)介紹:

1.如何在C/C++里面嵌入Lua腳本

2.Lua訪問(wèn)C/C++數(shù)據(jù)結(jié)構(gòu)(這里面要介紹類,結(jié)構(gòu)體,函數(shù),變量,枚舉等數(shù)據(jù)類型在lua里面如何訪問(wèn))

3.C/C++訪問(wèn)Lua的數(shù)據(jù),主要是基本數(shù)據(jù)類型,函數(shù)和Table

4.Cocos2D-X里面的Lua綁定(含自動(dòng)綁定與手動(dòng)綁定)

5.Cocos2D-x里面Lua和C/C++相互調(diào)用

6.Cocos2D-x里面Lua和Java相互調(diào)用

7.Cocos2D-x里面Lua和Objective-C相互調(diào)用

本系列教程不會(huì)過(guò)多地介紹Lua的基本語(yǔ)法,關(guān)于Lua基本語(yǔ)法的學(xué)習(xí),推薦《Programming In Lua》。 如有紕漏,歡迎指出,謝謝。

另外,關(guān)于更新時(shí)間,每周一篇,定期或者不定期,呵呵。

Mac項(xiàng)目集成Lua

準(zhǔn)備工作

首先,新建一個(gè)控制臺(tái)應(yīng)用程序。 打開Xcode,New->Project->OSX->Command Line Tool,取名為L(zhǎng)esson01如下圖所示:

接下來(lái),我們需要下載lua5.2.3.下載完后,解壓縮,然后cd到剛剛解壓縮的路徑下面,輸入make macosx,這樣便可以生成Mac下面的lib文件。

接下來(lái)把剛剛解壓縮的文件夾拷貝到你新建的工程下面,然后設(shè)置include路徑和library路徑。(注意,這里是不需要把頭文件添加到Xcode里面的,只要指定include路徑,編譯的時(shí)候,編譯器會(huì)自動(dòng)去找的。)

因?yàn)槲业腖ua文件夾的路徑是:xxxx/Lesson01/lua-5.2.3,所以,我把search path和library path分別設(shè)置為:

復(fù)制代碼 代碼如下:

//search path
$(SRCROOT)/Lesson01/lua-5.2.3/src/
//library path
$(PROJECT_DIR)/Lesson01

下面是我的工程與lua之間的目錄結(jié)構(gòu),liblua.a文件是從src里面拷貝出來(lái)的。(前面我們使用make macosx生成出來(lái)的)

注意:如果直接添加lua的所有源碼,則會(huì)編譯報(bào)錯(cuò)。因?yàn)閘ua.c里面也有一個(gè)main函數(shù)。這個(gè)main函數(shù)是用來(lái)生成可執(zhí)行程序的。 另外,如果是添加其它第三方的庫(kù),也可以參考這個(gè)方法,添加search path和library path

C++調(diào)用Lua文件

首先,打開main.cpp,并包含以下頭文件:

復(fù)制代碼 代碼如下:

#include "lua.hpp"

如果此時(shí)編譯不報(bào)錯(cuò),則說(shuō)明你之前設(shè)置的search path是正確的,如果報(bào)錯(cuò),請(qǐng)自行調(diào)整search path。

這里面的lua.hpp的內(nèi)容如下:

復(fù)制代碼 代碼如下:

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

這才是大多數(shù)Lua教程里的代碼嘛。然后在main函數(shù)里面添加以下內(nèi)容:

復(fù)制代碼 代碼如下:

/1. 初始化Lua虛擬機(jī)
lua_State *lua_state;
lua_state = luaL_newstate();
//2.設(shè)置待注冊(cè)的Lua標(biāo)準(zhǔn)庫(kù),這個(gè)庫(kù)是給你的Lua腳本用的
//因?yàn)榻酉聛?lái)我們只想在Lua腳本里面輸出hello world,所以只引入基本庫(kù)就可以了
static const luaL_Reg lualibs[] =
{
    { "base", luaopen_base },
    { NULL, NULL}
};
//3.注冊(cè)Lua標(biāo)準(zhǔn)庫(kù)并清空棧
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、運(yùn)行hello.lua腳本
luaL_dofile(lua_state, "hello.lua");
//5. 關(guān)閉Lua虛擬機(jī)
lua_close(lua_state);

新建Lua文件

選擇New->File->Other,然后命名為hello.lua, 以下是hello.lua里面的內(nèi)容:

復(fù)制代碼 代碼如下:

print "Hello World"

編譯并運(yùn)行

此時(shí)編譯并運(yùn)行,這時(shí)可能看不到控制臺(tái)輸出”Hello World”。因?yàn)槟愕腖ua腳本沒(méi)有拷貝到程序里面去,我們需要再設(shè)置一下。如下圖所示: (注意:subpath要清空,copy only when installing去掉打勾)

這時(shí),編譯并運(yùn)行,你會(huì)得到如下結(jié)果 :

接下來(lái),我們講講IOS項(xiàng)目怎么集成Lua。

IOS項(xiàng)目集成Lua

IOS項(xiàng)目集成Lua的方式與Mac大同小異,順便補(bǔ)充一句,Lua本質(zhì)上是一個(gè)c程序,任何平臺(tái)下面集成相應(yīng)c庫(kù)的方法都是適用的。

這里我主要寫一些注意事項(xiàng)吧:

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

2.編譯ios可以通過(guò)添加一個(gè)static library,然后把所有的Lua文件添加到這個(gè)Library里面。最后,讓主項(xiàng)目依賴這個(gè)Library就可以了。

3.直接使用luaL_dofile(lua_state, “hello.lua”)是行不通的,因?yàn)閕os項(xiàng)目的資源路徑在一個(gè)沙盒里。我們必須取得全路徑才可以訪問(wèn)到這個(gè)hello.lua文件。以cocos2d-x為例,我們可以使用下面的代碼獲得hello.lua的全路徑,然后再傳遞給Lua虛擬機(jī)。

復(fù)制代碼 代碼如下:

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

Android項(xiàng)目集成Lua

Android集成Lua需要使用Android.mk把Lua打包成一個(gè)靜態(tài)庫(kù),然后在項(xiàng)目里面包含這個(gè)Lua模塊。具體的做法可以參考cocos2d-x。

相關(guān)文章

  • lua中操作json數(shù)據(jù)的方法

    lua中操作json數(shù)據(jù)的方法

    這篇文章主要介紹了lua中操作json數(shù)據(jù)的方法,本文講解使用cjson包操作JSON數(shù)據(jù),并給出了操作實(shí)例,需要的朋友可以參考下
    2015-04-04
  • Lua中table里內(nèi)嵌table的例子

    Lua中table里內(nèi)嵌table的例子

    這篇文章主要介紹了Lua中table里內(nèi)嵌table的例子,本文同時(shí)講解了如何訪問(wèn)內(nèi)嵌table方法的例子,需要的朋友可以參考下
    2015-04-04
  • Lua腳本實(shí)現(xiàn)遞歸刪除一個(gè)文件夾

    Lua腳本實(shí)現(xiàn)遞歸刪除一個(gè)文件夾

    這篇文章主要介紹了Lua腳本實(shí)現(xiàn)遞歸刪除一個(gè)文件夾,本文給出了C++和Lua兩個(gè)版本的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05
  • Lua中的弱引用介紹

    Lua中的弱引用介紹

    這篇文章主要介紹了Lua中的弱引用介紹,本文用一個(gè)實(shí)例講解了Lua弱引用的相關(guān)知識(shí),需要的朋友可以參考下
    2015-04-04
  • Lua文件讀寫詳解

    Lua文件讀寫詳解

    這篇文章主要介紹了Lua文件讀寫詳解,本文講解了文件讀寫的簡(jiǎn)單模型和完整模型,并給出了一個(gè)操作示例,需要的朋友可以參考下
    2015-04-04
  • Lua的函數(shù)環(huán)境、包實(shí)例講解

    Lua的函數(shù)環(huán)境、包實(shí)例講解

    這篇文章主要介紹了Lua的函數(shù)環(huán)境、包實(shí)例講解,本文分別對(duì)函數(shù)環(huán)境、包的定義、實(shí)現(xiàn)方式、使用方式做了分解,需要的朋友可以參考下
    2014-09-09
  • Lua中的全局變量、非全局變量總結(jié)

    Lua中的全局變量、非全局變量總結(jié)

    這篇文章主要介紹了Lua中的全局變量、非全局變量總結(jié),全局變量可稱之為L(zhǎng)ua環(huán)境變量,需要的朋友可以參考下
    2014-09-09
  • lua中賦值類型代碼詳解

    lua中賦值類型代碼詳解

    本文主要給大家介紹了lua中解析復(fù)制類型代碼的過(guò)程,非常的細(xì)致全面,有需要的小伙伴可以參考下
    2015-05-05
  • Lua編程中的一些基本語(yǔ)法整理

    Lua編程中的一些基本語(yǔ)法整理

    這篇文章主要介紹了Lua編程中的一些基本語(yǔ)法整理的相關(guān)資料,是Lua入門中最基礎(chǔ)的知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題

    Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題

    這篇文章主要介紹了Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2015-07-07

最新評(píng)論