Love2D中使用Lua加载luasteam的.so共享库报错问题求解
问题原因
- Lua的
package.cpath默认搜索路径和执行命令时的当前工作目录绑定,而非项目根目录。你在项目父目录执行love <FolderName>时,工作目录是父目录,找不到放在项目根目录下的luasteam.so;进入项目目录执行love ../<FolderName>时工作目录刚好是项目根目录,所以可以正常加载。 .love格式本质是zip压缩包,操作系统的动态链接器无法直接读取压缩包内的.so共享库文件,所以就算把luasteam.so打进.love包也会加载失败。
解决方案
开发阶段
在main.lua最开头,先将项目根目录动态添加到package.cpath中,注意路径拼接规则:
-- 获取项目根目录的绝对路径 local project_root = love.filesystem.getSource() -- 把项目根目录加入动态库搜索路径 package.cpath = package.cpath .. ";" .. project_root .. "/?.so" -- 再引入luasteam local Steam = require('luasteam')
之前修改package.cpath不生效,大概率是拼接的路径和luasteam.so的实际存放位置不匹配,用上面的写法可以自适应不同的启动位置。
发布打包阶段
不要把luasteam.so打包进.love文件,按照如下规则放置文件即可:
- 普通分发:将
luasteam.so和你的.love文件放在同一级目录 - 融合打包(把
.love和Love2D可执行文件合并为单个程序):将luasteam.so和最终生成的游戏可执行文件放在同一级目录 - 额外注意:luasteam依赖Steam官方的
libsteam_api.so,发布时也要把这个库放在同级目录,否则会出现二次加载失败。
内容的提问来源于stack exchange,提问作者Exquizzit
相关产品推荐
相关产品推荐

