【问题标题】:Lua DLL Library DependenciesLua DLL 库依赖项
【发布时间】:2016-10-12 06:18:37
【问题描述】:

我为 windows 创建了一个 lua 模块,一个 DLL,它有许多依赖项。这些依赖项是模块 DLL 正常运行所必需的,其中大多数依赖项是 C++ 运行时库(libstdc+-6.dll 和 libgcc_s_seh-1.dll 等)。我正在尝试使用package.loadlib 调用加载模块:

init = assert(package.loadlib("C:\\Path\\To\\My\\Module.DLL", "luaopen_MyModule"))
init()

依赖项和模块 DLL 位于主可执行文件的 DLL 之外的另一个文件夹中。因此,package.loadlib 似乎找不到模块的依赖项。将这些依赖项的路径添加到 PATH 变量时,它工作正常,但是我不允许在将使用 lua 模块的机器上修改 PATH,我也不能静态链接到依赖项。

有没有办法为lua中的依赖项指定搜索路径? lua 只会在 Windows 系统上使用,因此解决方案可能取决于平台。

【问题讨论】:

  • 您可以要求将这些 dll 捆绑在一起并与您的 dll 一起移动?您也可以尝试将libstdc++-6.dll 静态链接到您的 dll 中,这样就不需要外部 dll。 Mingw 有这个选项,不记得叫什么了...
  • 其他 dll 与我的 dll 在同一个文件夹中,但在主可执行程序之外的另一个文件夹中。您正在寻找的选项是 -static,但我不允许使用静态链接到标准库。
  • 现在多了一个:-static-libstdc++ 在这里查看更多stackoverflow.com/questions/14225083/… 我不知道seh dll 是否有等效的东西。
  • 另一个dll存在等效项,该选项称为-static-libgcc,但如问题中所述,禁止静态链接。所以这不是一个真正的选择。
  • 您可以随时调用 Windows API 函数 SetEnvironmentVariable。更改适用于您的进程,也就是说,您更改的变量不会传播回系统设置。

标签: c++ windows dll lua


【解决方案1】:

如果您无法静态包含这些依赖项或修改 PATH 以影响 DLL 搜索,您可以尝试另一种选择:在加载 Module.DLL 之前使用相同的 package.loadlib 调用直接加载这些依赖项。当我想确保我的库所依赖的 DLL 是从正确的位置加载时,我使用了它:

package.loadlib([[C:\Path\To\Whatever\libstdc++-6.dll]], "")
init = assert(package.loadlib("C:\\Path\\To\\My\\Module.DLL", "luaopen_MyModule"))
init()

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2011-02-25
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多