分步驟總結(jié)一下在做這樣一個(gè)小實(shí)例的過程中進(jìn)行的工作和遇到的問題准谚。
參考博客:
lua和c語言互相調(diào)用的例子
VS2012建立調(diào)用lua腳本工程
Lua環(huán)境
首先需要配置一下Lua語言環(huán)境尘盼,下載Lua的解釋器
示例中我使用的是Lua 5.1版本
新建和配置C++工程
在VS2012中新建一個(gè)“Win32 控制臺(tái)應(yīng)用程序”耙册。
然后配置頭文件目錄:
右鍵單擊項(xiàng)目->屬性->VC++目錄
在包含目錄中添加Lua5.1中的include文件夾的路徑狡恬,因?yàn)樵贑++中需要包含這個(gè)目錄下的頭文件虚缎。
然后添加依賴庫:
右鍵單擊項(xiàng)目->連接器->輸入
在附加依賴項(xiàng)中添加Lua5.1中l(wèi)ib目錄下的lib51.lib文件路徑蚣旱。這是執(zhí)行l(wèi)ua腳本必不可少的庫钦购。
編寫C++代碼
在主函數(shù)(win32平臺(tái)下,主函數(shù)名為_tmain)所在的cpp文件中編寫如下代碼:
// TestCppLua.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)都许。
//
#include "stdafx.h"
#include <stdio.h>
//包含lua相關(guān)頭文件
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
//添加一個(gè)C++語言函數(shù)
int add(lua_State* L)
{
//從lua狀態(tài)機(jī)的棧中取出索引為1的int型數(shù)值
int x = luaL_checkint(L, 1);
//從lua棧中取出索引為2的int型數(shù)值
int y = luaL_checkint(L, 2);
printf("result:%d + %d = %d\n", x, y, x + y);
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
lua_State* L = luaL_newstate(); //新建一個(gè)lua狀態(tài)機(jī)
luaL_openlibs(L); //打開相關(guān)的庫
lua_pushcfunction(L, add); //將c++函數(shù)add入棧
lua_setglobal(L, "ADD"); //設(shè)置全局符號(hào)ADD
//加載lua腳本文件稻薇,這里使用了需要執(zhí)行的Lua腳本文件的絕對(duì)路徑
if (luaL_loadfile(L, "E:\\TestProj\\TestCppProj\\TestCppLua\\TestCppLua\\myLua.lua"))
{
printf("error in load lua file.");
}
//執(zhí)行一次腳本,生成function
lua_pcall(L, 0, 0, 0);
//將lua函數(shù)myfunction入棧
lua_getglobal(L, "myfunction");
//執(zhí)行腳本胶征,執(zhí)行function
lua_pcall(L, 0, 0, 0);
printf("Lua is done.");
getchar();
return 0;
}
編寫Lua腳本
新建了一個(gè)myLua.lua文件塞椎,在文件中寫下如下的代碼:
-- 定義一個(gè)myfunction函數(shù)
function myfunction()
print("in myLua")
ADD(1, 2) -- 調(diào)用ADD函數(shù)
ADD(100, 200)
end
運(yùn)行這個(gè)實(shí)例
在VS2012中,調(diào)試我的win32控制臺(tái)應(yīng)用程序睛低。在配置好包含目錄和依賴庫的情況下案狠,代碼一次編譯通過
調(diào)試窗口如圖:
運(yùn)行過程總結(jié)
在C++中
1.定義一個(gè)add函數(shù)。
2.新建一個(gè)Lua狀態(tài)機(jī)暇昂。
3.打開lua相關(guān)庫莺戒。
4.函數(shù)add入棧伴嗡,并設(shè)置全局變量ADD來表示C++中的add函數(shù)急波,可以在lua腳本中使用ADD來訪問C++中的add函數(shù)。
5.加載lua腳本文件瘪校。
6.執(zhí)行一次腳本澄暮,如果不執(zhí)行,則lua腳本中定義的全局函數(shù)myfunction不會(huì)存在阱扬。
7.將lua腳本中的函數(shù)myfunction入棧泣懊。
8.再執(zhí)行腳本,即會(huì)執(zhí)行myfunction函數(shù)麻惶。
在Lua中
1.定義一個(gè)myfunction函數(shù)馍刮。在myfunction函數(shù)中調(diào)用全局函數(shù)ADD(這個(gè)函數(shù)實(shí)際是在C++代碼中添加到Lua狀態(tài)機(jī)中的)。
深入學(xué)習(xí)
看懂了上述過程窃蹋,理解了C++調(diào)用Lua腳本的基本過程之后可以來看看這篇博客
Lua和C++交互詳細(xì)總結(jié)
通過這篇博客可以更深入了解C++與Lua語言的配合使用卡啰。感謝以上幾位博主。