lua:lua環境搭建


Lua除了是一門擴展的言語外,還是一門“膠水語言”。最著名的就是作為游戲的腳本開發。

這里主要說lua怎樣與c交互。

Lua和c語言通信的主要方法是一個無所不在的虛擬棧。幾乎所有的API調用都會操作這個棧上的值。所有的數據交換,無論是Lua到C語言或C語言到Lua都通過這個棧來完成。棧可以解決Lua和C語言之間存在的兩大差異,第一種差異是Lua使用垃圾收集,而C語言要求顯式地釋放內存;第二種是Lua使用動態類型,而C語言使用靜態類型。

 

下載好Lua源碼,可以選擇在不同的平台編譯,編譯也很簡單,下面是在windows下的編譯方法。(我用的是lua5.1,感覺新版本變化很大,相應的教程也沒有5.1的多。)

1.打開vs的命令行工具,工具-->visual studio 2005 command prompt
2.跳轉到 etc的上一級目錄,如:cd /d d:\lua
2.執行:etc\luavs.bat( 注意,是 \ 不是 /,寫錯了不能執行編譯 )
3.然后lua51.dll, lua51.lib, lua.exe, and luac.exe就生成在 src路徑下了。
當然,也可以自定義生成文件的名字,具體請看luavs.bat。

然后就可以編寫第一個c與lua交互的程序。

#include <stdio.h>
#include <string.h>
extern "C" 
{
    #include "lua.h"
    #include "lauxlib.h"
    #include "lualib.h"
}

#pragma comment(lib, "lua.lib")

int main(void)
{
    char buff[256];
    int error;
    lua_State *L = luaL_newstate();//創建一個新的環境
    luaL_openlibs(L);//打開標准庫

    while(fgets(buff,sizeof(buff),stdin)!=NULL)
    {
        error = luaL_loadbuffer(L,buff,strlen(buff),"line") || lua_pcall(L,0,0,0);
        if (error)
        {
            fprintf(stderr,"%s",lua_tostring(L,-1));
            lua_pop(L,1);//從棧中彈出錯誤消息
        }
    }
    lua_close(L);
    return 0;
}

 

ps:

luaL_newstate用c運行庫的內存分配函數。
lua_newstate可自定義內存分配函數。

 

頭文件lua.h定義了lua提供的基礎函數,包括創建lua環境、調用lua函數(如lua_pcall)、讀寫lua環境中全局變量,以及注冊供lua調用的新函數等。Lua.h中定義所有內容都有一個lua_前綴。

頭文件lauxlib.h定義了輔助庫(auxiliary library,auxlib)提供的函數。它的所有定義都以luaL_開頭(如luaL_loadbuffer)。輔助庫是一個使用lua.h中API編寫出的一個較高的抽象層。Lua的所有標准庫編寫都用到了輔助庫。

注意:Lua腳本的編譯執行是相互獨立的,在不同的線程上執行。通過luaL_newstate()函數可以申請一個虛擬機,返回指針類型lua_State。今后其他所有Lua Api函數的調用都需要此指針作為第一參數,用來指定某個虛擬機。所以lua_State代表一個lua虛擬機對像,luaL_newstate()分配一個虛擬機。lua類庫管理着所有的虛擬機。銷毀指定虛擬機的所有對像(如果有垃圾回收相關的無方法則會調用該方法)並收回所有由該虛擬機動態分配產生的內存,在有些平台下我們不需要調用此函數,因為當主程序退出時,資源會被自然的釋放掉,但是但一個長時間運行的程序,比如后台運行的web服務器,需要立即回收虛擬機資源以避免內存過高占用。

 

因為lua5.0到lua5.2接口略有變化,環境搭建也略有不同,詳情看源碼下的README。

擴展閱讀:

Lua 5.1 參考手冊

lua users wiki

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM