Lua與C++交互初探之C++調用Lua

Lua與C++交互初探之C++調用Lua

自從學習了lua這個腳本語言以後,無時不想着將他與c/c++聯繫起來,看看他真正的威力。奈何水平有限,網上找的代碼不管怎樣都沒法運行成功。我知道是我少了某一步可是又不知道到底少了什麼,因而就在各大博客、網站、論壇不斷的摸索測試。我也不知道花了多長時間。總之在今天測試成功了。我把我測試遇到的問題和解決過程貼出來供你們參考。ios

 1、lua環境的搭建 c++

  1. 建議去網上下載luaforwindow,這是一款跟衆多window系統的軟件同樣,安裝起來簡單方便,一路點next就能搞定了。並且他還包含了有用的與lua有關的基本工具編輯器

    他包括如下組件:函數

    Lua(Command Line):lua的一個命令行編輯器。簡單輕便,習慣命令行編(zhuang)輯(bi)的能夠試試。工具

    Lua Examples: 包含lua使用的一些例子。學習

    LuaForWindows Documentation :LuaForWindows這款軟件的一些說明測試

    QuickLuaTour : lua快速入門嚮導,沒什麼用,看看就好網站

    SciTE:lua的一個不錯的文本編輯器。能夠在裏面測試一些lua代碼,能夠運行測試。前提是要先保存文件在運行,不然他沒有任何反應。別問我是怎麼知道的,心塞塞ui

    Documentation:裏面包含lua的幫助文檔,最有用的就是他了吧。lua

     

     

    安裝好後Lua的環境就算是搭建好了。咱們用命令行簡單來測試一下:

Ok,木有問題

 

 2、VS環境配置

  1. 這一步是最重要的,一開始我是去lua官網下載的源文件再把他們添加到vs項目,雖然編譯是沒有問題了,可是在測試運行的時候連接仍是出現了問題。很明顯我是少了什麼東東。後來我改用下面的方法解決了問題。

    1. 選中項目,右鍵->屬性->定位到VC++目錄項

    1. 在"可執行文件目錄"裏添加上lua的安裝目錄。過程以下:

      定位到Lua的安裝文件夾,個人是:

       

      肯定後返回

       

       

    2. 用一樣的步驟,將"lua安裝目錄\5.1\include"添加到"包含目錄";
    3. 將"lua安裝目錄\5.1\lib"添加到"庫目錄";
    4. 跳到"鏈接器"的"輸入"欄。將"附加依賴項"中添加上"lua51.lib;lua5.1.lib";

     

     

    至此環境基本就配置好了。相似下面:

    如今咱們用代碼測試一遍:

#include "stdafx.h"
#include <iostream>
#include <string.h>
using namespace std;
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
void main()
{
    //1.建立一個state
    lua_State *L = luaL_newstate();
    //2.入棧操做
    lua_pushstring(L, "Hello World~");
    //3.取值操做
    if (lua_isstring(L, 1)) { //判斷是否能夠轉爲string
        cout << lua_tostring(L, 1) << endl; //轉爲string並返回
    }
    //4.關閉state
    lua_close(L);
    system("pause");
    return;
} 

 

 

是否是木有問題啦╮(╯▽╰)╭

喏,咱們親愛的World君

 

  1. Lua與C++的交互測試

    上面咱們已經把須要的環境什麼的都配置好了,如今重頭戲上場( ̄︶ ̄)

    1. 咱們建一個test.lua文件;
    function Communicate(name)
    return ("Hello "..name..", I`m in Lua");
    end

     


    1. 咱們調用lua文件的cpp代碼

    

#include "stdafx.h"
#include <iostream>  
#include <string.h>  
using namespace std;

extern "C"
{
#include "lua.h"  
#include "lauxlib.h"  
#include "lualib.h"  
}
void main()
{
    string hello = "This is Zack, I`m in C++";
    cout << hello.c_str() << endl;
    //建立Lua狀態  
    lua_State *L = luaL_newstate();
    if (L == NULL)
    {
        return;
    }

    //加載Lua文件  
    int bRet = luaL_loadfile(L, "test.lua");
    if (bRet)
    {
        cout << "load file error" << endl;
        return;
    }

    //運行Lua文件  
    bRet = lua_pcall(L, 0, 0, 0);
    if (bRet)
    {
        cout << "pcall error" << endl;
        return;
    }
                                      //讀取函數  
    lua_getglobal(L, "Communicate");        // 獲取函數,壓入棧中  
    lua_pushstring(L, "Zack");          // 壓入參數  
    int iRet = lua_pcall(L, 1, 1, 0);// 調用函數,調用完成之後,會將返回值壓入棧中,第一個1表示參數個數,第二個1表示返回結果個數。  
    if (iRet)                       // 調用出錯  
    {
        const char *pErrorMsg = lua_tostring(L, -1);
        cout << pErrorMsg << endl;
        lua_close(L);
        return;
    }
    if (lua_isstring(L, -1))        //取值輸出  
    {
        string Result = lua_tostring(L, -1);
        cout << Result.c_str() << endl;
    }

    //關閉state  
    lua_close(L);
    system("pause");
    return;
}

 

結果:

 

 

嗯,大功告成。就醬紫了╰( ̄▽ ̄)╮╭(′▽`)╯╰( ̄▽ ̄)╮

相關文章
相關標籤/搜索