前文须知
本文旨在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复制#include <iostream>
#include <lua.hpp>
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:%dn", 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:%sn", err);
}
ret = luaL_dostring(L, "TestFunc");
ret = lua_getglobal(L, "HelloCPP");
top = lua_gettop(L);
printf("top:%dn", top);
if (ret == LUA_TFUNCTION)
{
if (lua_pcall(L, 0, 0,0) != LUA_OK)
{
const char * err = lua_tostring(L, -1);
printf("err:%sn", err);
lua_pop(L, 1); // 清除错误消息
}
else
{
printf("调用HelloCPP成功n");
lua_pop(L, 1); // 弹出栈顶的函数引用
}
}
top = lua_gettop(L);
printf("top:%dn", 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复制#include <iostream>
#include <lua.hpp>
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复制#include <iostream>
#include <lua.hpp>
#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自定义项目模版(图解版)