本文旨在Windows平台下基于Visual Studio 编译器能够快速使用Lua
并提供了四种可参考方案:
并使用C/C++结合Lua简单调用Lua文件
进入lua官网
https://www.lua.org/download.html
进入官网的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
lua官网->lua官网的Binaries->History
点击lua下载页面左边的history
https://luabinaries.sourceforge.net/index.html#history
选择对应的版本下载即可,这里以Lua 5.4.2为例
下载解压缩即可
打开Visual Studio创造一个新项目
右键项目名称->属性
找到C/C++->附加包含目录 加入存放lua的文件夹里的include
如图所示:
找到链接器->附加库目录 如图所示引入lua附加库目录
如图所示:
引入lib文件
点开链接器->输入->附加依赖项:
如图所示
如果忽略引入lib文件这一步,也可以在项目文件里直接引入
#pragma comment(lib,"lua54.lib")
print("Lua:执行Test.lua")
TestFunc()
function HelloCPP( )
print("Lua:你好C++")
end
#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:%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;
}
进入官网
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;
测试代码
#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;
}
print("hello world!")
我们首先要知道第三方调用时关键的文件为 .lib文件 和 .dll文件 以及工程目录下的 .h头文件 。
所以我会以生产动态链接库的lib和dll文件,再引入相应的.h文件进行一个lua dll加载测试。
其实生成动态链接库后的具体流程可以参考2.编译好的文件下载(VS使用最快捷)
VS新建项目,搜索 Windows ,选择 “ Windows 桌面向导 ”,
创造项目时选择动态链接库-空项目
将下载的lua5.4.7源代码的.c和.h文件全部引入(除lua.c和luac.c以外),并包含于项目
源代码下载可以参考直接编译源代码
存储于项目中的方式可以像直接编译源代码的示例一样分src或者include,这次图省事不分了
右键项目并点击属性 ->C/C++->预处理器定义
加入如下语句:
LUA_BUILD_AS_DLL;
应用并且确定
右键项目生成
找到生成的dll文件
VS生成一个需要导入Lua库的测试项目
新建一个include文件夹并导入下载的源代码里的这部分文件
并修改如下属性
右键项目->属性->C/C++->附加包含目录->$(SolutionDir)include;
将之前生成的lib和dll文件丢入该项目所在文件夹里
找到链接器->附加库目录 如图所示引入lua附加库目录
代码测试环节
#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;
}
print("hello world!")
注意你也可以不在代码里通过#pragma comment(lib, "LuaDllP")
引入
而是如下
Q:为什么是动态链接库引入,而不是静态链接库引入?
A:多个应用程序如果使用相同的动态链接库,那么它们可以共享同一份库文件的内存映像。避免多个Lua虚拟机状态。并且动态链接可以保持可执行文件较小。
我们还可以将引入lua的项目保存为一个模版方便以后创造需要使用lua的项目
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有