【问题标题】:How to use ZeroBrane Studio IDE debugger when lua is compiled as c++lua编译为c++时如何使用ZeroBrane Studio IDE调试器
【发布时间】:2018-04-26 23:49:13
【问题描述】:

我已将 Lua 5.3 编译为 32 位 c++ DLL 和 exe。 DLL 包含除 lua.cpp 和 luac.cpp 之外的所有 lua 代码。 exe 编译 lua.cpp 并使用 DLL 运行 lua 解释器。从命令行单独运行时,这可以正常工作。我希望能够使用这个 DLL 和 exe 从 IDE 运行。

如果我将/ZeroBraneStudio/bin/lua53.dlllua53.exe 替换为我自己的版本,我可以运行脚本(单击两个绿色箭头)。但是,调试不起作用,出现以下错误:

在动态链接库lua53.dll中找不到过程入口点luaL_addlstring。

我可以看到这是因为调试器正在使用 luasocket。 \ZeroBraneStudio\bin\clibs53\socket\core.dll 依赖于 lua53.dll,并期望它包含编译为 c 的 lua。

那么,正确的解决方案是什么 - 是否也将 luasocket 编译为 c++?

(如果有的话,是否有人有这样做的说明/指导?我一直找不到任何关于此的内容。)

谢谢。

【问题讨论】:

    标签: dll lua luasocket zerobrane


    【解决方案1】:

    我不确定 DLL 是如何编译的,但错误消息可能表明它没有导出 luaL_addlstring 和其他函数。如果符号正确导出,您应该能够加载 luasocket 并进行调试。见this thread for the related discussion

    此外,您不需要替换 lua53 库和可执行文件,因为您可以使用 path.lua53 配置设置将 IDE 配置为使用您自己的副本,如 documentation 中所述。

    【讨论】:

    • 您好 Paul,我认为错误消息表明无法找到该函数,因为 DLL 正在导出一个损坏的 c++ 函数名称。名称修改意味着函数名称在 C 和 C++ 之间的导出方式不同。所以 luasocket core.dll 正在寻找 C 名称“luaL_addlstring”,但只存在损坏的名称。我确信符号已正确导出,因为 Lua 解释器 exe 能够加载 DLL 并运行。感谢您提供有关配置设置的信息。
    【解决方案2】:

    好的,我能够让它工作。解决方案是将 luasocket 编译为 c++。我不会在此处提供有关如何执行此操作的完整说明,但希望对遇到相同问题的其他人有所帮助:

    • 从这里获得 luasocket:https://github.com/diegonehab/luasocket
    • 将所有 *.c 文件重命名为 *.cpp
    • 将 Lua52.props 重命名为 Lua.props(我使用的是 lua 5.3,但似乎兼容?)
    • 将 lua 头文件和库放在适当的文件夹中
    • 在 Visual Studio 2012 中打开的解决方案
    • 修复了项目文件的小问题,例如文件重命名。
    • 在 luaopen_socket_core 和 luaopen_mime_core 函数的声明中添加了“extern "C"”(lua 能够加载库所必需的)。
    • 内置解决方案
    • 将新的 dll 复制到 clibs53/socket 和 clibs53/mime 文件夹中。

    我使用 Dependency Walker 来帮助解决这个问题。如果以后有人想了解更多细节,请发表评论。

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2018-06-25
      相关资源
      最近更新 更多