首页 > 代码库 > Lua初学者(三)--Lua 嵌入宿主语言(C++/C)

Lua初学者(三)--Lua 嵌入宿主语言(C++/C)

继续上节内容,在C中使用Lua,这个网上资源也比较多了,不过我这里也提下哈,毕竟自己过一遍还是很有好处的。


环境:Lua5.1,vs2013中文版

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


1.下载lua源码么:http://www.lua.org/download.html 


就OK了

2.打开VS2013,新建工程: 新建-->项目==》Win32控制台应用程序(起名:lua5.1)-->下一步-->①.选择:静态库;②.取消:预编译头-->完成



3.添加Lua的资源文件,生成静态库。

①.项目-->添加现有项(Shift+Alt+A);

②.选择 lua-5.2.3.tar.gz   最终解压包下 Src 目录下全部文件,点击 -->添加


(添加后会出现 三角)


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文件的文件目录,绝对路径就可以了。(懒人操作)


②.C/C++  -->常规 -->附加包含目录

这里添加  lua-5.2.3.tar.gz   最终解压包下 Src 的目录


③.C/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.编译运行一下,

不是咱们的效果,因为没有执行 test.lua文件内容,


打开Debug文件夹,这里执行下:



OK! 我就不用解释了吧。

直接把 Luatest.exe test.lua 复制到任何地方,双击可以运行了,也就是说,不需要在使用Lua的动态库了。

(完)


Lua初学者(三)--Lua 嵌入宿主语言(C++/C)