(1)下载lua src。
最新版本是5.2.3。 下载地址。
(2)新建VS Win32控制台应用程序,取名为Lua。在应用程序设置中选择应用程序类型为静态库,附加选项中取消预编译头的勾选。
(3)在Lua的VS项目文件夹中新建LuaSrc目录,用于存放Lua源码。解压下载的lua src,拷贝src目录下所有 * .c和 * .h文件到LuaSrc。
(4)在Lua的VS项目文件夹中新建bin目录,用于存放Lua.lib。
(5)在VS环境中,右键点击Lua项目,选择添加->现有项,导入LuaSrc目录下所有的文件。
(6)右键点击Lua项目,选择属性,在顶部选择所有配置,然后修改配置属性->常规->输出目录为
$(SolutionDir)bin
(7)为了禁止一些安全警告(Windows程序员知道为什么),需要再修改配置属性->C/C++–>预处理器->预处理器定义,在末尾添加
_CRT_SECURE_NO_DEPRECATE_SCL_SECURE_NO_DEPRECATE
(8)选择release模式,点击项目,生成Lua.lib即可。Lua.lib生成在bin目录下。
2.调用Lua静态库
(1)在Lua解决方案下新建名字为HelloLua的Win32控制台程序,采用默认选项,不做修改。
(2)右键点击HelloLua项目,选择属性,修改配置属性->C/C++–>附加包含目录,新增
..\LuaSrc
(3)在修改配置属性->链接器->输入->附加依赖项,新增
..\bin\Lua.lib
或者使用代码链接lua库,即在HeloLua.cpp中添加如下代码,
#pragma comment (lib,"../bin/Lua.lib")
(4)设置HelloLua项目为默认启动项,点击生成项目即可。
(5)因为此时main函数并没有执行任何代码,所以控制台一闪而过。右键HelloLua项目的源文件,添加新建项,取名hellolua.lua。
(6)一个简单的调用示例:
复制代码
*hellolua.lua*
print("Hello, Lua")
*HelloLua.cpp*
#include "stdafx.h"
#pragma comment (lib,"Lua.lib")
#include "lua.hpp"
int _tmain(int argc, _TCHAR* argv[])
{
lua_State* lua_state = luaL_newstate()
luaL_openlibs(lua_state)
luaL_dofile(lua_state,"hellolua.lua")
lua_close(lua_state)
getchar()
return 0
}
复制代码
效果
3.生成Lua.exe和Luac.exe
由于下载的lua源码中包含lua.c和luac.c,这两个文件都有main入口,同时编译的话会出错,所以只要删除其中一个,另一个就可以正常编译。
(1)新建VS空项目,取名为Lua。
(2)在Lua的VS项目文件夹中新建LuaSrc目录,用于存放Lua源码。解压下载的lua src,拷贝src目录下是所有 * .c和 * .h文件。
(3)在VS环境中,右键点击Lua项目,选择添加->现有项,导入LuaSrc目录下所有的文件。
(4)右键点击Lua项目,选择属性,在顶部选择所有配置,然后修改配置属性->C/C++–>预处理器->预处理器定义,在末尾添加
_CRT_SECURE_NO_DEPRECATE_SCL_SECURE_NO_DEPRECATE
(5)在Lua项目的源文件,找到luac.c,右键移除。
(6)选择release模式,点击项目生成lua.exe即可。
(7)同理在同个解决方案下创建LuaC空项目,按以上步骤生成luac.exe。只是第五步要改为“找到lua.c,右键移除”。
(8)lua.exe和luac.exe生成在Lua项目目录下的release目录。
programming in lua 有相关的例子,一般脚本语言和c/c++之类的互相调用分两类,一类是扩展,就是将c/c++模块封装起来给脚本语言用,用swig做封装很方便的,一类是嵌入,就是在c/c++等应用中嵌入lua引擎,一般是用来分离经常变化的逻辑部分,比如WOW就是用lua语言作为扩展,用户可以编写lua脚本来完成一些特定功能的机器人。你要做的就是使用lua c api来在你的程序中执行lua。类似这种:int iErr = 0
lua_State *lua = lua_open () // Open Lua
luaopen_io (lua) // Load io library
if ((iErr = luaL_loadfile (lua, "test.lua")) == 0)
{
// Call main...
if ((iErr = lua_pcall (lua, 0, LUA_MULTRET, 0)) == 0)
{
// Push the function name onto the stack
lua_pushstring (lua, "helloWorld")
// Function is located in the Global Table
lua_gettable (lua, LUA_GLOBALSINDEX)
lua_pcall (lua, 0, 0, 0)
}
}
lua_close (lua)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)