为啥用 lua 替换 luajit

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥用 lua 替换 luajit相关的知识,希望对你有一定的参考价值。

参考技术A   1、新建一个名为1.lua的文件,里面只有一句话print("Hello Lua"),新建一个空的out.lua脚本文件
  2、开始--运行--cmd
  3、luac -o out.lua 1.lua
  注: luac -o [编译后脚本名] [脚本名],必要时带上脚本路径,如:

  

  回车之后,再打开out.lua就可以看到编译好的字节码了

  

  然后实验一下,执行这个字节码脚本,可以看到lua原生的解释器可以直接解析luac编译出来的bytecode脚本,很方便!

  

  重点:
  做完了以上的一系列之后,我照着这个方法编译项目中的脚本,然后在cocos2dx环境下使用,发现不行!于是又查了一下资料,发现2dx使用的是luajit,lua原生编译出来的bytecode和luajit是不兼容的,所以照着上面方法编译出来的bytecode脚本无法在2dx中使用。
  解决这个问题其实很简单,就是用2dx自带的luajit编译lua脚本,下面附上luajit编译bytecode的方法:
  1、在cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src目录下有个msvcbuild.bat批处理文件,需要先把luajit.exe这个东西给编译出来。
  2、打开visual studio的命令行工具,这个只要装了vs都会有,在安装目录里面可以找到。
  3、用vs的命令行工具cd到luajit的src目录
  4、执行msvcbuild.bat批处理文件,编译出luajit.exe

  

  编译完成之后,会在src目录下生成一系列文件,其中有一个luajit.exe

  

  接下来就可以使用luajit.exe编译lua脚本的bytecode了:luajit -b [脚本名] [编译后的脚本名],执行完后会在src目录下生成一个已经编译成bytecode的jit.lua文件

  

  
  下面把编译之后的jit.lua放在2dx中试一下,以HelloLua工程为基础,把jit.lua放到\samples\Lua\HelloLua\Resources下,修改AppDelegate.cpp中的lua调用为std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("jit.lua");

LuaJit 找不到通过“luarocks”安装的库“lua-vips”

【中文标题】LuaJit 找不到通过“luarocks”安装的库“lua-vips”【英文标题】:LuaJit won't find a library "lua-vips" installed via "luarocks" 【发布时间】:2019-11-05 09:49:53 【问题描述】:

我有这个 lua 文件:

-- test1.lua 


--require "luarocks.loader"
vips = require "vips"
--vips = require "lua-vips"



local img = vips.Image.new_from_file("img1.jpg")
-- [...................]

找不到通过“luarocks”安装的库“lua-vips”:

$ luajit test1.lua 
luajit: error loading module 'vips' from file '/usr/local/lib/luarocks/rocks-5.3/':
  cannot read /usr/local/lib/luarocks/rocks-5.3/: Is a directory
stack traceback:
  [C]: at 0x0102caa660
  [C]: in function 'require'
  test1.lua:2: in main chunk
  [C]: at 0x0102c3b8a0

即使我添加了

export LUA_PATH="/usr/local/lib/luarocks/rocks-5.3/"

~/.profile,不会。

目录luarocks的内容——lua-vips存在:

  ls /usr/local/lib/luarocks/rocks-5.3/

  lua-vips  manifest

如何解决这个问题?

$ luarocks path
export LUA_PATH='/Users/my_user/.luarocks/share/lua/5.3/?.lua;/Users/my_user/.luarocks/share/lua/5.3/?/init.lua;/usr/local/share/lua/5.3/?.lua;/usr/local/share/lua/5.3/?/init.lua;/usr/local/Cellar/luarocks/3.0.1/share/lua/5.3/?.lua;/usr/local/lib/lua/5.3/?.lua;/usr/local/lib/lua/5.3/?/init.lua;./?.lua;./?/init.lua'
export LUA_CPATH='/Users/my_user/.luarocks/lib/lua/5.3/?.so;/usr/local/lib/lua/5.3/?.so;/usr/local/lib/lua/5.3/loadall.so;./?.so'
export PATH='/Users/my_user/.luarocks/bin:/usr/local/bin:/Users/my_user/.yarn/bin:/Users/my_user/.config/yarn/global/node_modules/.bin:/Users/my_user/.nix-profile/bin:/Users/my_user/.nvm/versions/node/v8.14.0/bin:/Users/my_user/.cargo/bin:/Users/my_user/.gem/ruby/2.5.1/bin:/Users/my_user/.rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/bin:/Users/my_user/.rubies/ruby-2.5.1/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/my_user/go/bin'

【问题讨论】:

【参考方案1】:

您的问题是 LUA_PATH 的工作方式与 PATH 通常的工作方式不同。

你没有给它一个目录,而是一个带有?的模板字符串,代表要加载的库的名称。

因此,例如,如果您想在/path/to/libs/ 目录中查找文件,您可以在路径中写入"/path/to/libs/?.lua;/path/to/libs/?/init.lua"

如果你真的添加"/usr/local/lib/luarocks/rocks-5.3/",Lua 会尝试将该目录加载为 Lua 文件,这会导致你的错误。

删除该环境变量并告诉我们您遇到了什么错误。

另外请记住,向 .profile 添加内容需要注销并重新登录才能使更改生效(或在您打开的每个新 shell 中添加到 source ~/.profile

【讨论】:

以上是关于为啥用 lua 替换 luajit的主要内容,如果未能解决你的问题,请参考以下文章

LuaJIT 是如何工作的 - 解释模式

lua 和 luajit的区别

cocos2dx 用luajit 加密脚本 会被反编译吗

lua jit 可以在ios下运行么

lua语言如何替换多个字符并记录替换位置和替换内容

LuaJIT版从零开始在 macOS 上配置 Lua 开发环境