Windows下Lua的下载与安装使用基于Visual Studio编译器

前文须知

本文旨在Windows平台下基于Visual Studio 编译器能够快速使用Lua

并提供了四种可参考方案:

直接执行Lua编译环境下载已经编译好的库直接使用源代码自己编译库引用并使用C/C++结合Lua简单调用Lua文件

lua的下载和安装使用进入lua官网

https://www.lua.org/download.html

1.可执行文件下载安装(无需编译器使用)进入官网的Binaries页面,点击下载进入该页面

https://luabinaries.sourceforge.net/download.html

下载lua-5.4.2_Win64_bin.zip Windows x64平台下的可执行文件

笔者将下载并解压缩后的文件都放入了D:\lua-5.4.2这个文件夹中,以下部分演示都基于该文件夹,也可以自行挑选存储目录

如图所示

这时可以直接点开lua54.exe使用lua编译环境

本地环境的引入(可选)如果下载了可执行文件,可以引入环境变量

打开环境变量页面

在系统变量这里点击编辑

新建环境变量路径并指向存放lua相关可执行文件的文件夹

确认环境变量引入成功打开cmd界面 输入lua54执行 ,并测试相应代码

有的版本是输入Lua 或者存放lua可执行文件文件夹里lua.exe对应的名称 例如lua52.exe 则lua52

2.编译好的文件下载(VS使用最快捷)lua官网->lua官网的Binaries->History

点击lua下载页面左边的history

https://luabinaries.sourceforge.net/index.html#history

选择对应的版本下载即可,这里以Lua 5.4.2为例

下载解压缩即可

编译好的lib,dll和include的引入打开Visual Studio创造一个新项目

右键项目名称->属性

找到C/C++->附加包含目录 加入存放lua的文件夹里的include

如图所示:

找到链接器->附加库目录 如图所示引入lua附加库目录

如图所示:

引入lib文件

点开链接器->输入->附加依赖项:

如图所示

如果忽略引入lib文件这一步,也可以在项目文件里直接引入

#pragma comment(lib,"lua54.lib")

简单验证使用创造一个Test.lua文件代码语言:lua复制print("Lua:执行Test.lua")

TestFunc()

function HelloCPP( )

print("Lua:你好C++")

end相应的cpp代码代码语言:cpp代码运行次数:0运行复制#include

#include

int Lua_Test(lua_State* L)

{

std::cout << "CPP:Lua你好\n" << std::endl;

return 0;

}

int main() {

lua_State* L = luaL_newstate(); // Lua5开头以后的版本使用luaL_newstate()代替lua_open()

// 加载所有lua标准库

luaL_openlibs(L);

int top = lua_gettop(L);

printf("top:%d\n", top);

//注册函数

lua_pushcfunction(L, Lua_Test);

lua_setglobal(L, "TestFunc");

// 执行Lua文件

int ret = luaL_dofile(L, "test.lua");//这里是相对路径

if (ret != LUA_OK)

{

const char* err = lua_tostring(L, -1);

printf("err:%s\n", err);

}

ret = luaL_dostring(L, "TestFunc");

ret = lua_getglobal(L, "HelloCPP");

top = lua_gettop(L);

printf("top:%d\n", top);

if (ret == LUA_TFUNCTION)

{

if (lua_pcall(L, 0, 0,0) != LUA_OK)

{

const char * err = lua_tostring(L, -1);

printf("err:%s\n", err);

lua_pop(L, 1); // 清除错误消息

}

else

{

printf("调用HelloCPP成功\n");

lua_pop(L, 1); // 弹出栈顶的函数引用

}

}

top = lua_gettop(L);

printf("top:%d\n", top);

lua_close(L);

return 0;

}运行截图3.直接编译源代码因为以上便捷操作都是基于5.4.2如果想要使用最新的5.4.7版本或者对查询和更改源代码有需求直接编译源代码或者编译成动态链接库导入进入官网

https://www.lua.org/download.html

下载lua-5.4.7.tar.gz

解压缩到所需项目中

.c文件放到scr文件夹

.h.hpp文件放到include文件夹

并将其全部包含到项目中

如图所示

找到.c文件里的 lua.c 和luac.c

将他们的 main函数注释

lua.c第670行起:

luac.c 第196行起:

项目属性设置:右键项目属性->C/C++->附加包含目录

填入$(SolutionDir)include;

测试代码

代码语言:cpp代码运行次数:0运行复制#include

#include

int main() {

lua_State* L = luaL_newstate(); // 使用luaL_newstate()代替lua_open()

// 加载标准库

luaL_openlibs(L);

// 执行Lua文件

luaL_dofile(L, "test.lua");

lua_close(L);

return 0;

}代码语言:lua复制print("hello world!")4.自己编译成动态链接库导入我们首先要知道第三方调用时关键的文件为 .lib文件 和 .dll文件 以及工程目录下的 .h头文件 。

所以我会以生产动态链接库的lib和dll文件,再引入相应的.h文件进行一个lua dll加载测试。

其实生成动态链接库后的具体流程可以参考2.编译好的文件下载(VS使用最快捷)

1. 创造项目引入文件VS新建项目,搜索 Windows ,选择 “ Windows 桌面向导 ”,

创造项目时选择动态链接库-空项目

将下载的lua5.4.7源代码的.c和.h文件全部引入(除lua.c和luac.c以外),并包含于项目

源代码下载可以参考直接编译源代码

存储于项目中的方式可以像直接编译源代码的示例一样分src或者include,这次图省事不分了

2.VS项目属性修改右键项目并点击属性 ->C/C++->预处理器定义

加入如下语句:

LUA_BUILD_AS_DLL;

应用并且确定

右键项目生成

找到生成的dll文件

3. 生成DLL和LIB测试VS生成一个需要导入Lua库的测试项目

新建一个include文件夹并导入下载的源代码里的这部分文件

并修改如下属性

右键项目->属性->C/C++->附加包含目录->$(SolutionDir)include;

将之前生成的lib和dll文件丢入该项目所在文件夹里

找到链接器->附加库目录 如图所示引入lua附加库目录

代码测试环节

代码语言:cpp代码运行次数:0运行复制#include

#include

#pragma comment(lib, "LuaDllP")

int main() {

lua_State* L = luaL_newstate(); // 使用luaL_newstate()代替lua_open()

// 加载标准库

luaL_openlibs(L);

// 执行Lua文件

luaL_dofile(L, "test.lua");

lua_close(L);

return 0;

}代码语言:lua复制print("hello world!")注意你也可以不在代码里通过#pragma comment(lib, "LuaDllP")引入

而是如下

一些题外话Q:为什么是动态链接库引入,而不是静态链接库引入?

A:多个应用程序如果使用相同的动态链接库,那么它们可以共享同一份库文件的内存映像。避免多个Lua虚拟机状态。并且动态链接可以保持可执行文件较小。

我们还可以将引入lua的项目保存为一个模版方便以后创造需要使用lua的项目

Visual Studio自定义项目模版(图解版)