天天看點

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

繼續上節内容,在C中使用Lua,這個網上資源也比較多了,不過我這裡也提下哈,畢竟自己過一遍還是很有好處的。

環境:Lua5.1,vs2013中文版

----------------------------------------------------一、C++中配置 lua----------------------------------------

1.下載下傳lua源碼麼:http://www.lua.org/download.html 

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

就OK了

2.打開VS2013,建立工程: 建立-->項目==》Win32控制台應用程式(起名:lua5.1)-->下一步-->①.選擇:靜态庫;②.取消:預編譯頭-->完成

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

3.添加Lua的資源檔案,生成靜态庫。

①.項目-->添加現有項(Shift+Alt+A);

②.選擇 lua-5.2.3.tar.gz   最終解壓包下 Src 目錄下全部檔案,點選 -->添加

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

(添加後會出現 三角)

4.完成後編譯即可。

最終生成檔案:

如果是 Release 模式下編譯:(解決方案目錄)/Release/lua.lib

若在   Debug模式下編譯:     (解決方案目錄)/Debug/lua.lib

提示:會遇到的錯誤

1. 錯誤 1 error C4996: 'sprintf': This function or variable may be unsafe. Cons

方法一:手工将原來的舊函數替換成新的Security CRT functions。 

方法二:屏蔽這個警告。 

            在預編譯頭檔案stdafx.h裡(注意:一定要在沒有include任何頭檔案之前)定義下面的宏: 

            #define _CRT_SECURE_NO_DEPRECATE 

            或者#param warning(disable:4996) 

方法二沒有使用新的更安全的CRT函數,顯然不是一個值得推薦的方法,可是你又不想一個一個地改。 

那麼還有一個更友善的方法: 

在預編譯頭檔案stdafx.h裡(同樣要在沒有include任何頭檔案之前)定義下面的宏: 

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

在連結的時候便會自動将舊函數替換成Security CRT functions。 

注意:這個方法雖然使用了新的函數,但是不能消除警告你還得同時使用方法二。。。

詳細解釋:http://blog.csdn.net/popppig/article/details/8571075

----------------------------------------------------二、C++中如何調用 lua----------------------------------------

1.建立項目:

建立-->項目==》Win32控制台應用程式(起名:Luatest)-->下一步--> 完成 (完成即可)

2.設定屬性:

項目-->屬性==》 配置屬性下:

①.VC++目錄-->應用目錄 

在這裡添加 上面 Lua5.1 工程生成的lib檔案的檔案目錄,絕對路徑就可以了。(懶人操作)

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

②.C/C++  -->正常 -->附加包含目錄

這裡添加  lua-5.2.3.tar.gz   最終解壓包下 Src 的目錄

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

③.C/C++  -->進階

選擇 編譯為C代碼

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

3.設定完畢了,可以撸代碼了:

先看看 lua.hpp,以後引用這個檔案就OK,不必寫下面那麼多東西了

<span style="font-family:Arial;font-size:18px;">// lua.hpp
// Lua header files for C++
// <<extern "C">> not supplied automatically because Lua also compiles as C++

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
</span>
           

test.lua 檔案内容:

<span style="font-family:Arial;font-size:18px;">print "The test.lua has open !"
print "hello world !"
print "檔案加載完畢 !"

test = "我是 test 變量!"
</span>
           

這裡要是正文了,咱們的Cpp檔案:

/**
* 函數名:Func
* 作者:豬豬俠
* 日期:2014年11月12日	20:46:21
**/

// Luatest.cpp : 定義控制台應用程式的入口點。
//

#include "stdafx.h"
#include <iostream>
#include "lua.hpp"
/**
* 等價于:
* extern "C" {
* #include "lua.h"
* #include "lualib.h"
* #include "lauxlib.h"
* }
**/


int _tmain(int argc, _TCHAR* argv[])
{	
	//建立虛拟機
	lua_State *L = luaL_newstate();

	//載入庫
	luaL_openlibs(L);

	//這裡直接在C++裡執行下  lua 代碼
	const char *buf = "print('Hello World')";
	luaL_dostring(L, buf);

	//這裡執行 test.lua  Lua檔案
	luaL_dofile(L, "test.lua");

	//擷取 傳回結果
	lua_getglobal(L,"test");
	printf("\n%s\n", lua_tostring(L, -1));

	//一定記得關閉虛拟機
	lua_close(L);

	system("pause");
	return 0;
}

           

4.編譯運作一下,

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

不是咱們的效果,因為沒有執行 test.lua檔案内容,

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

打開Debug檔案夾,這裡執行下:

Lua初學者(三)--Lua 嵌入宿主語言(C++/C)

OK! 我就不用解釋了吧。

直接把 Luatest.exe 和test.lua 複制到任何地方,輕按兩下可以運作了,也就是說,不需要在使用Lua的動态庫了。

(完)

繼續閱讀