如何在应用程序中使用 Lua 静态库和 Lua 加载模块

我正在使用 Lua 5.3 作为应用程序中的静态库。我编写了一个作为 C Dll 的 Lua 模块,这个模块也使用 Lua 5.3 作为静态库。

在加载的模块中,我注册了一个函数,该函数返回一张键为字符串、值为整数的表格。

我发现在多次调用该函数时会出现随机崩溃,崩溃显示在 lua_gc 上。

我使用带有存根库的 dll 编译了 Lua,并链接了我的应用程序和 Lua 模块。此后,我没有发现崩溃。

所以,难道不建议将 Lua C 模块连接到 Lua 上静态库吗?

点赞
用户2328287
用户2328287

短回答

不要这样做。

长回答

  1. 必须确保 Lua 库使用相同的编译标志(对齐方式、基础类型大小)。
  2. 必须共享内存分配器。如果一个 Lua 静态库分配缓冲区,则另一个库应该能够释放它(使用 MSVC 动态链接相同的运行时库,不要链接静态 msvcrt.lib)。

其他取决于操作系统。

在 Windows 上,你可以从你的应用程序导出 Lua API 并将模块 DLL 链接到该可执行文件中(Ru SciTE 团队就是这样做的)。

但是,最好的方式是仍然是动态链接 Lua 库。

更新

还有一种变体。你可以将所有需要的 Lua 模块静态链接。这样应该是安全的。

2017-09-26 11:31:24