如何在 Lua 编译为 C++ 时使用 ZeroBrane Studio IDE 调试器

我已将 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++ 吗?

(如果是这样,是否有关于此的说明/指导?我找不到任何关于此的信息。)

谢谢。

点赞
用户1442917
用户1442917

我不确定 DLL 是如何编译的,但错误信息可能表明 luaL_addlstring 和其他函数未被导出。如果这些符号被正确导出,则应该能够加载 luasocket 并使调试正常工作。请参阅 此线程相关讨论

此外,您无需替换 lua53 库和可执行文件,因为可以使用 path.lua53 配置设置来配置 IDE 使用自己的副本,如文档所述 (https://studio.zerobrane.com/doc-general-preferences#interpreter-path)

2017-11-14 16:55:47
用户8936842
用户8936842

好的,我已经成功地让它工作了。解决方案是将 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 来帮助解决此问题。如果有人在将来需要更多详细信息,请留下评论。

2017-11-23 02:30:59