lua加载luasocket

本文讲述了在使用lua过程中遇到luasocket库加载失败的问题,深入分析了加载失败的原因,发现是package.path和package.cpath设置不正确。通过调整这两个变量的设置,成功解决了库的加载问题。总结强调了对lua模块与包的理解对于解决问题的重要性。

lua加载luasocket

0x00缘起

最近在使用lua处理相关问题,在测试代码时遇到了luasocket的库的是用。
源码编译,没有什么大问题,问题出现在库的使用上,require加载失败

0x01 现象

socket = require("socket")
stdin:1: module 'socket' not found:
        no field package.preload['socket']
        no file './socket.lua'
        no file '/usr/share/lua/5.1/socket.lua'
        no file '/usr/share/lua/5.1/socket/init.lua'
        no file '/usr/lib64/lua/5.1/socket.lua'
        no file '/usr/lib64/lua/5.1/socket/init.lua'
        no file './socket.so'
        no file '/usr/lib64/lua/5.1/socket.so'
        no file '/usr/lib64/lua/5.1/loadall.so'
stack traceback:
        [C]: in function 'require'
        stdin:1: in main chunk
        [C]: ?

初步分析,luasocket安装在/usr/local/share/lua/5.1,这样导致加载不上
为了不动系统环境,我在自己的环境下测试。

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> package.path = "./5.1/lua/?.lua;"..package.path
> package.cpath = "./5.1/lib/?/?.so;"..package.cpath
> socket = require("socket")
lua: ./5.1/lua/socket.lua:12: module 'socket.core' not found:
        no field package.preload['socket.core']
        no file './5.1/lua/socket/core.lua'
        no file './socket/core.lua'
        no file '/usr/share/lua/5.1/socket/core.lua'
        no file '/usr/share/lua/5.1/socket/core/init.lua'
        no file '/usr/lib64/lua/5.1/socket/core.lua'
        no file '/usr/lib64/lua/5.1/socket/core/init.lua'
        no file './5.1/lib/socket/core/socket/core.so'
        no file './5.1/lua/socket/core/socket/core.so'
        no file './socket/core.so'
        no file '/usr/lib64/lua/5.1/socket/core.so'
        no file '/usr/lib64/lua/5.1/loadall.so'
        no file './5.1/lib/socket/socket.so'
        no file './5.1/lua/socket/socket.so'
        no file './socket.so'
        no file '/usr/lib64/lua/5.1/socket.so'
        no file '/usr/lib64/lua/5.1/loadall.so'
stack traceback:
        [C]: in function 'require'
        ./5.1/lua/socket.lua:12: in main chunk
        [C]: in function 'require'
        1.lua:7: in main chunk
        [C]: ?

还是出错了,分析了加载的库,这个是luasocket加载的库core出错了。觉得是库的问题。

0x02 深入分析

这个问题当时没有解决,觉得这个问题不好解决。今天我测试了下,将库拷贝到lua执行时的临时目录,这次可以加载这个库,问题有了头绪,觉得不是库本身的问题,应该是加载库的问题。
于是,我查看了下package.path和packet.cpath,找到了相关说明。
查找库的基本顺序是,环境变量、预加载、指定path、显示加载。具体详见lua程序设计的模块与包。指定path时,有个技巧可以使用?作为站位符。
第一次失败时按照后的库的位置不正确,导致不能加载库。
测试代码中packag.path与package.cpath设置不正确。

no file './5.1/lib/socket/core/socket/core.so'

对应于

package.cpath = "./5.1/lib/?/?.so;"..package.cpath

即?被socket.core代替。
解决方案也随之明确。

package.cpath = "./5.1/lib/?.so;"..package.cpath

0x03 总结

应该从本质上解决问题,这个问题是由于对于package不了解导致。
在以后不明确的事情,需要查明,减少问题的发生。

题外

luasocket的安装路径是在/usr/local/share/lua与/usr/lib/lua
而我的环境是/usr/share/lua/与/usr/lib64/lua
这样,我如下安装,问题得以解决

vim src/makefile #修改lib为lib64
 sudo make install PLAT=linux DEBUG=DEBUG LUAV=5.1 prefix=/usr

小插曲,我按照src/makefile 中export导出,安装还是存在问题的路径。
原因是export 的环境是普遍用户,install需要root,而root没有export。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值