如何在Windows平台使用VS搭建C++Lua的开发环境

如何在Windows平台使用VS搭建C++Lua的开发环境,第1张

1.生成Lua静态库

(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目录。

利用lightuserdata和metatable来协调解决这个问题。也即将数据指针给lua,另外告诉它一个如何 *** 作这些数据的metamethods即可。

typedef struct

{

int x

int y

int z

}TData

static int getAttribute(lua_State* L)

{

TData *data = (TData*)lua_touserdata(L, 1)

std::string attribute = luaL_checkstring(L, 2)

int result = 0

if(attribute == "x")

{

result = data->x

}

else if(attribute == "y")

{

result = data->y

}

else

{

result = data->z

}

lua_pushnumber(L, result)

return 1

}

static struct luaL_reg dataLib[] = {

{"__index", getAttribute},

{NULL, NULL}

}

void getMetaTable(lua_State* L, luaL_reg* methods)

{

lua_pushlightuserdata(L, methods)

lua_gettable(L, LUA_REGISTRYINDEX)

if (lua_isnil(L, -1)) {

/* not found */

lua_pop(L, 1)

lua_newtable(L)

luaL_register(L, NULL, methods)

lua_pushlightuserdata(L, methods)

lua_pushvalue(L, -2)

lua_settable(L, LUA_REGISTRYINDEX)

}

}

int main()

{

const char* filename = "test.lua"

lua_State *lua = lua_open()

if (lua == NULL)

{

fprintf(stderr, "open lua failed")

return -1

}

luaL_openlibs(lua)

TData input = {1, 2, 3}

lua_pushlightuserdata(lua, &input)

getMetaTable(lua, dataLib)

lua_setmetatable(lua, -2)

lua_setglobal(lua, "input")

if (luaL_dofile(lua, filename))

{

luaError(lua, "load file %s failed", filename)

}

lua_getglobal(lua, "data")

int output = lua_tointeger(lua, 0)

std::cout <<output <<std::endl

return 0

}

lua本身就是用标准C编写的,它的优点是小巧和灵活,而且又是动态语言,是解释执行的,所以适合用在游戏和一些嵌入式环境里。

至于你上面所说的动态弱类型,垃圾收集,函数式编程,闭包等等,需要你至少读完一本lua书籍(Programming in Lua)才能有个大概的了解,这些概念都不是一蹴而就的,需要不断的积累。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11587420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存