【问题标题】:Is there a Windows/MSVC equivalent to the -rpath linker flag?是否有与 -rpath 链接器标志等效的 Windows/MSVC?
【发布时间】:2010-09-11 14:17:17
【问题描述】:

在 Linux/GCC 上,我可以使用 -rpath 标志更改共享库的可执行文件搜索路径,而无需调整环境变量。

这也可以在 Windows 上完成吗?据我所知,总是在可执行文件的目录和 PATH 中搜索 dll。

我的场景:我想根据共享库的属性(32/64 位/调试/发布)将共享库放入位置,而不考虑唯一名称。在 Linux 上,这很容易通过 rpath 完成,但我还没有找到在 Windows 上执行此操作的任何方法。

感谢任何提示!

【问题讨论】:

    标签: windows dll shared rpath


    【解决方案1】:

    遗憾的是,没有与 RPATH 直接类似的东西。有许多替代的可能性,每一种都可能以自己的特殊方式不受欢迎。

    鉴于您无论如何都需要为每种构建风格使用不同的 exe 以避免运行时库冲突,因为您可能猜到最简单的做法是将每个 exe 与每组 DLL 放在同一文件夹中。

    正如您也提到的,最通用的方法是通过使用批处理文件引导 exe 来更改 PATH 变量。

    您可以在将程序运行到所需的 DLL 文件夹之前更改当前工作目录。

    您可以在 exe 中使用函数 SetDllDirectoryAddDllDirectory。这可能是最接近 RPATH 的,但仅适用于 WinXP SP1 或更高版本。

    如果您愿意更改每个 exe 风格的文件名,可以使用“App Paths”注册表项。每个 exe 都需要一个唯一的文件名。

    【讨论】:

    • 不幸的是,微软关闭了在最近的 Windows 10 版本中编写修改后的系统 ᴅʟʟ 在加载应用程序以进行黑客攻击的目录中的技巧(因为它允许在 System32 中覆盖系统 ᴅʟʟ)。这意味着 ᴅʟʟ 的内部目录无法再从该目录中加载可执行文件。
    • 实际上,这几乎不是一个把戏。众所周知的 DLL 会在系统启动时预加载(即它们存在 Section/MMF 对象)。这些将总是优先于位于某处的那些。但是仍然有办法通过 TLS 回调和延迟加载来解决所有这些问题。
    • ...是的,通过一些创造性的思考延迟加载也可以与知名的 DLL 一起使用?
    【解决方案2】:

    Windows 中 DLL 的搜索顺序在 MSDN 上的 this page 中有描述。如果你使用run-time dynamic linking,你可以在调用LoadLibrary时指定文件夹。

    【讨论】:

      【解决方案3】:

      "Isolated applications" 是一种嵌入描述 DLL 依赖关系的 XML 清单的机制。

      【讨论】:

      • 此机制仅适用于程序集。这属于托管代码。
      • 你有这方面的参考吗?我在这个主题上看到的所有内容似乎都允许原生代码 DLL。
      • 程序集在Wikipedia 上定义。 MSDN 似乎仅将术语 Assembly 与 MSI Assemblies 结合使用。因此,您引用的文章属于已安装的应用程序。 rpath 信息嵌入到应用程序中,并且不依赖于安装。 rpath在链接后才生效。
      • 这与我看到的任何东西都不匹配。 Wikipedia 不是关于 Windows API 如何工作的权威,MSDN 是。我将不理会答案,请随时发布您自己的答案。
      • @Christian:您的 Wiki 定义是针对 .NET 程序集的,当然,它只是被管理的。但程序集不一定是 .NET 程序集。 Windows 上的程序集实际上只不过是可执行映像和描述它的 XML 文件的配对,而且它当然也适用于非托管代码。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-11
      • 2014-12-14
      相关资源
      最近更新 更多