Lua5.2 请求 luasocket 相关模块时的 multiple-lua-vms-detected

Lua5.2 请求 luasocket 相关模块时的 multiple-lua-vms-detected,第1张

概述首先说一下5.3貌似没有这个问题, 但是目前最新版的luasocket 3.0 rc1只能支持5.2, 5.3调用的话程序会崩溃(不知道是不是我没配置好) 出现这个问题的原因, 想必网上有很多资料了, 就是C model的静态和动态链接的问题, lua5.2不支持 >= 2的静态链接, 而如果在编译得到lua.lib的时候用了静态链接,  编译得到socket.dll 和 mime.dll的时候链

首先说一下5.3貌似没有这个问题,但是目前最新版的luasocket 3.0 rc1只能支持5.2,5.3调用的话程序会崩溃(不知道是不是我没配置好)


出现这个问题的原因,想必网上有很多资料了,就是C model的静态和动态链接的问题,lua5.2不支持 >= 2的静态链接,而如果在编译得到lua.lib的时候用了静态链接, 

编译得到socket.dll 和 mime.dll的时候链接了它,那么在命令行解释的时候,相当于链接了两次,就会出现这样的错误.


很可惜,现在网上大多数是linux下的解决方案,好不容易遇到一两个windows下的又不知所云,于是我自己摸索出了一套方案,编译工作交给了VS2012.


一. 得到lua.dll和lua.lib

首先新建一个vc++空项目,将 lua/src 中除了luac.c和lua.c的.h.c文件全部导入,项目 -> 属性设置 将配置类型改为dll,并且在C/C++ -> 预处理器中加上

_CRT_SECURE_NO_WARNINGS
LUA_BUILD_AS_DLL

这两项.

然后重新生成项目就可以得到dll和lib了.

二. 得到解释器 将项目内的文件全部移去,将lua.c加入,然后在链接器中设置相关内容,使得项目能够链接到刚才生成的lib. 然后将配置类型改回exe,生成项目得到解释器文件lua.exe.
有需要的话可以移除lua.c,加入luac.c得到编译器.
将lua.exe 和 lua.dll放在同一文件下就可以使用了. 三. 编译luasocket相关项目 将luasocket 3.0从github上扒下来以后,根目录有个Lua52.props,将其改为Lua.props,然后直接打开 luasocket.sln 解决方案中包含了mime和socket,他们的配置方式是相同的:
1. 注意配置类型是不是dll,不是的话改成dll,然后目标文件名也改改. 2. VC++目录中的包含目录和引用目录需要包含 lua/src文件夹 3. 在链接器中设置相关内容,使得项目能够链接到刚才生成的lua.lib.
编译以后,取出两个dll,以及一些相关的.c.h 放到相应位置就好了.  具体放在哪里呢......... 在lua文件中写一句 http = require("socket.http") 运行,你就能根据报错知道放哪里了 放的地方可以改,参考 点击打开链接
大概就这样了....可以愉快地写个爬虫去爬一些 '有趣' 的内容了哦呵呵.... 总结

以上是内存溢出为你收集整理的Lua5.2 请求 luasocket 相关模块时的 multiple-lua-vms-detected全部内容,希望文章能够帮你解决Lua5.2 请求 luasocket 相关模块时的 multiple-lua-vms-detected所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

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

原文地址: http://outofmemory.cn/langs/1246540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存