【问题标题】:Compile lua5.2 files to one with using require and dofile使用 require 和 dofile 将 lua5.2 文件编译为一个
【发布时间】:2018-08-03 07:08:28
【问题描述】:

我可以将我的所有文件编译为一个,然后从 C 中执行吗?在我的 lua 文件中,我使用了 require 和 dofile 函数。当我尝试使用 luac 进行编译然后我想执行编译后的文件时,它将无法找到我在编译文件中构建的模块。我认为通过 require 和 dofile 函数 luac 编译器过程包含 lua 文件,例如 javascript 编译器。简而言之,Javascript 编译器将导入文件添加到一个中。

当您发布应用程序时,将 lua 脚本放在一个文件中是一种好的做法吗?因为我有一些带有 lua 脚本的目录,所以当我发布时,我必须拥有所有具有可读形式二进制文件的 lua 文件。

【问题讨论】:

  • 顺便说一句,在 LuaJIT(即 Lua 5.1,而不是您需要的 Lua 5.2)中,有一种方法可以将任何 Lua 模块编译为字节码并生成目标文件 luajit -b test.lua test.obj,它可以与您的主机应用程序链接用 C 语言编写,因此该模块存储在可执行文件中,并且可以通过 require("test") 访问,就好像该模块是通常的外部文件一样。
  • 是的,我听说过 luajit,但如果你必须降级而不是升级到 lua5.3,我认为这是一个退步。或者您认为使用较旧的 lua 是一种好方法。
  • 这取决于您真正需要什么:语言中的几个新功能或 3 倍速度。
  • 诚实吗? 3倍速度。所以这让我信服。我会尝试它,只是我有点害怕迁移。谢谢
  • 嗯,Luajit 的二进制/运行时也大得多(尽管与其他语言相比仍然很小),并且在 显着 更少的平台上编译 - 就像普通 Lua 在每个 C99 平台上编译一样

标签: c lua luac


【解决方案1】:

luac 不是打包工具,而只是一个编译器。它会将你提供给它的所有东西——只要它是有效的 Lua——编译成 Lua 字节码

如果您需要将所有内容放在一个文件中并希望使用require 包含您的模块,则必须稍微修改您的源文件,以便require 知道在内存中的何处找到这些模块。

只需将其放在所有 Lua 模块文件的末尾即可:

package.loaded["<yourmodnamehere>"] = yourmodreturnvalue

然后在 Lua 初始化之后直接 requireluaL_dofile 组合 Lua。

无论您使用 dofile 做什么,将代码重写为函数可能更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2014-11-29
    • 1970-01-01
    • 2018-07-04
    • 2014-12-26
    • 2016-01-14
    • 2019-01-24
    • 2016-07-23
    相关资源
    最近更新 更多