如何在VS2010中运行Lua文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在VS2010中运行Lua文件?相关的知识,希望对你有一定的参考价值。

我用的C++,在C++中要调用到Lua函数,如何在VS2010中运行Lua文件?
具体怎么配置?Lua我已经下载了,希望有经验的大侠们能给出详细步骤,我之前有在网上找到一些步骤了,但是里面有些不懂,如果大侠们是直接从网上找来的话,希望能懂的其中的步骤!
先谢谢回答的人了!
可能我表达的意思不够清楚,我不单单只是要编译Lua文件,而是在CPP文件里写C++,然后里面要用到某个lua文件(比如自己编写的my.lua)里的函数,然后究竟要怎么配置,方可使程序编译运行后不会说引用不到lua文件及它的库文件!麻烦有经验的朋友们说说!

简单,去下个LUA for windows,安装完毕后,到安装目录里找到lua51.dll和lua51.lib以及相关的头文件

然后是代码:
#include <stdio.h>
extern "C"
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#pragma comment(lib, "lua5.1.lib")
lua_State* L;

int main ( int argc, char *argv[] )

/* initialize Lua */
L = lua_open();
/* load Lua base libraries */
luaL_openlibs(L);
luaL_dofile(L, "my.lua");//载入代码文件并执行
//假设里面的函数是这样的:function LuaFun(a,b) return a+b,a-b end

lua_getglobal(L, "LuaFun");
lua_pushnumber(L, 10);//压入参数1
lua_pushnumber(L, 20);//压入参数2
lua_call(L, 2, 2);//调用函数,2个参数,2个返回值
int a = luaL_checkinteger(L, 1);//第一个返回值
int b = luaL_checkinteger(L, 2);//第一个返回值
lua_pop(L, 2);//清理堆栈
printf("a:%d,b:%d\n",a,b);
/* cleanup Lua */
lua_close(L);
/* pause */
printf( "Press enter to exit..." );
getchar();
return 0;

参考技术A 搭建编程环境的步骤和使用其他第三方C库没有什么区别,先设置好lua的3个头文件的路径,和一个lib 的路径,然后编写C代码。

你肯定已经看过相关的手册了,正确初始化lua_State以后,可以使用luaL_dofile执行磁盘上的lua脚本文件,也可以使用luaL_dostring执行脚本片段。后者相当于JScript里面的eval()函数,可以执行lua脚本文件中的全部或某一个特定部分。

如果担心找不到,就把它们放在同一个文件夹下,require会默认搜索包括当前路径下的lua、clibs文件夹追问

你好,我下载的lua库是5.1.5的,搭建环境就是用这个,然后在网上看到的一些程序,有些函数我在VS2010中使用时,识别不了,是版本的问题吗?是的话,那5.1.5与之前旧的版本相比改变的那些(比如函数名)你知道吗?或者知道怎么找出来吗?我去Lua的官方那里查看文档也找不到它有说到改变的地方!麻烦你的回答了!先谢谢你了

如何在 Windows 上集成 LuaJIT 和 LuaRocks?

【中文标题】如何在 Windows 上集成 LuaJIT 和 LuaRocks?【英文标题】:How to integrate LuaJIT with LuaRocks on Windows? 【发布时间】:2014-11-09 10:42:02 【问题描述】:

我下载了 LuaJIT 的源代码并用 msvc120.dll (VS 2013 x64) 编译它。当我从命令行运行它时,执行一些基本的 lua 没有问题。现在 LuaJIT 安装指南提到将 luajit.exe 和 lua51.dll 移动到它们自己的文件夹中。从那里它说要创建一个 lua 文件夹,并在该文件夹下创建一个包含 src/jit 内容的 jit 文件夹移动到新创建的 jit 文件夹下。

据我了解,我的文件夹应如下所示并包含:

luajit.exe lua51.dll /lua /jit bc.lua [其余的 jit 文件] vmdef.lua

这是正确的还是我缺少文件?

现在,在我构建了我的 luajit 之后,我尝试将它连接到我的 luarocks 中,以使用

充当我的解释器
install.bat /LUA C:\LuaJIT\2.0.3\[folder with above content]

但是这找不到头文件。然后我将头文件复制到上面的文件夹中并将其连接起来,但是当指向 LuaJIT 时,我实际上永远无法编译任何东西。 编辑:我得到的错误如下,

C:\LuaJIT\2.0.3\bin\lua51.dll:致命错误 LNK1107:无效或损坏的文件:无法在 0x2D0 读取 错误:安装依赖项失败:https://rocks.moonscript.org/luafilesystem-1.6.2-2.src.rock - 构建错误:编译模块 lfs.dll 失败

处理这个问题的正确方法是简单地指向我的 lua 二进制文件并从那里利用 LuaJIT 来运行我的文件,还是我在连接 LuaJIT 和 luarocks 时做错了什么?前者似乎在大多数情况下都有效,因为我只遇到了一个库编译问题,lua-cjson。

【问题讨论】:

当你说“当指向 LuaJIT 时,我永远无法编译任何东西”是什么意思?究竟会发生什么? @EtanReisner 我用错误消息更新了问题。 【参考方案1】:

我遇到了完全相同的问题,但他们在这里找到了解决方案:

https://github.com/keplerproject/luafilesystem/issues/22

我知道“静态链接 DLL”有一个所谓的“导出”.lib 文件,该文件被传递给链接器(而不是 DLL 本身)。

因此,例如,在编译时,LuaRocks 是这样做的:

cl /nologo /MD /O2 -c -Fosrc/mime.obj -ID:/LuaJIT-2.0.4/include/ src/mime.c -DLUA_COMPAT_APIINTCASTS -DLUASOCKET_DEBUG -DNDEBUG -DLUASOCKET_API=__declspec(dllexport) -DMIME_API=__declspec(dllexport) mime.c
link -dll -def:core.def -out:mime/core.dll D:/LuaJIT-2.0.4/bin/lua51.dll src/mime.obj

我的 LuaJIT 是从 D:\LuaJIT-2.0.4\src 中的源代码编译的,但我自己创建了两个文件夹:D:\LuaJIT-2.0.4\include 和从 src 复制的所有 *.h 文件和 D:\LuaJIT-2.0.4\binluajit.exelua51.dll,然后后来lua51.explua51.lib。仍然是同样的错误,但这是正确的轨道。

修复

现在,检查你的 LuaRocks 配置在哪里:

luarocks.bat help

向下滚动到如下部分:

CONFIGURATION
    Lua version: 5.1
    Configuration files:
            System: D:/luarocks/config-5.1.lua (ok)
            User  : (... snip ...)

编辑系统配置文件,具体见部分:

variables = 
    MSVCRT = 'VCRUNTIME140',
    LUALIB = 'lua51.dll' 

这里! LUALIB 应该是 .lib 文件。如果您的导出库在 DLL 旁边,您只需更改为:

variables = 
    MSVCRT = 'VCRUNTIME140',
    LUALIB = 'lua51.lib' -- here!

验证

现在:

luarocks.bat install luasocket
(...)
link -dll -def:core.def -out:socket/core.dll D:/LuaJIT-2.0.4/bin/lua51.lib src/luasocket.obj (...)
(...)
luasocket 3.0rc1-2 is now built and installed in D:\luarocks\systree (license: MIT)

注意传递给链接器的第一个参数。

【讨论】:

以上是关于如何在VS2010中运行Lua文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在VS2010中运行编译C和C++?

如何在VS2010中运行编译C和C++?

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

有关vs2010中运行.rc文件问题

VS2010编译调用Lua程序

在vs2012中,如何创建c语言程序?