【问题标题】:For package.loadlib does lua require the dll to be COFF format or ELF format?对于 package.loadlib,lua 是否要求 dll 为 COFF 格式或 ELF 格式?
【发布时间】:2016-03-17 05:44:42
【问题描述】:

我正在尝试将 dll 加载到我的 lua 脚本中并调用该函数。当我使用 GCC(在 cygwin 下)和 lua(5.2.4)创建 dll 时,我能够加载库并毫无问题地执行它。 但是,当我使用 Lua 5.1 从 SciTE 创建运行相同的脚本时,dll 加载成功。但是,它不执行。在 dll 中,我试图简单地将两个整数写入文件。

t = package.loadlib("mylibrary.dll","myfunc")
t(23,45)

这里有两个问题: 1. 'mylibrary.dll' 应该是什么格式,以便 lua 能够毫无问题地理解和执行 - ELF 或 COFF。 2.我可以在linux上运行的lua下运行dll(显然是windows下构建的)吗?

【问题讨论】:

  • 您可能必须使用 Lua 5.1 头文件和库来编译您的 dll。
  • 即使我的 dll 功能不做任何 Lua 操作,我是否需要考虑 Lua 版本?在 DLL 中,我只是将我从 Lua 收到的值写入文件。
  • 在 5.1 和 5.2 之间没有 ABI 兼容性,但如果您使用 Lua API 的一小部分子集,您可能会很幸运。
  • Lua 使用标准的共享库函数(例如dlopendlsym)来加载共享库,因此它支持它们所支持的任何内容。我认为尝试在 Linux 进程上加载 Windows DLL 是行不通的。
  • 为了进一步进行这个实验 - 我使用 VisualStuido 构建了一个 dll。这是为了确保我使用的是本机编译器。想清楚 dll 在 windows 平台上是好的。该 dll 是使用 lua 5.1 头文件和库编译的。 lua 5.1 loadlib() 仍然导致错误“找不到指定的过程”。有什么想法吗???我正在遵循lua.org/pil/26.2.html 中提到的准则

标签: scripting lua elf coff


【解决方案1】:

您标题中的问题似乎与您描述的问题原因大相径庭。

一方面,Lua 加载的动态库的格式是 Lua 代码运行平台的格式。正如您不能获取已编译的 Win32 可执行文件并期望它在 Linux 上运行一样,您也不能获取已编译的 Win32 dll 并期望它在 Linux 上加载它。显然存在像 Wine 这样的仿真工具,但它们通过仿真 Windows 来工作。您可以在模拟器内运行它们,但不能在模拟器外运行。

但另一方面,这不是问题的根源。您的问题是您正在使用为一个版本的 Lua 构建的动态库和为另一个版本的 Lua 构建的应用程序。那是行不通的; Lua 不保留“次要”版本之间的兼容性,仅在修订之间(Lua 5.1.3 与 5.1.4)。

ELF 或 COFF,这是行不通的。

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2012-10-01
    • 2011-01-11
    • 1970-01-01
    • 2011-03-07
    • 2011-11-27
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多