【问题标题】:Linking with -R and -rpath switches on Windows在 Windows 上使用 -R 和 -rpath 开关进行链接
【发布时间】:2013-08-22 00:03:24
【问题描述】:

我在 Windows XP 上使用 gcc 编译器 (MinGW)。我创建了一个 .dll 库 libdir.dll,而不是尝试构建一个使用该库的程序。
我不想将该 .dll 文件放入 System 或 System32 文件夹,也不想在 PATH 变量中设置它的路径,我想要的是将该信息提供给程序本身。
我知道有一个 -R-rpath 开关可用,所以我打算将它与其中一个链接。

第一个-rpath:
gcc -L/path/to/lib -Wl,-rpath,/path/to/lib ma​​in. o -ldir -o prog

比-R:
gcc -L/path/to/lib -Wl,-R,/path/to/lib ma​​in. o -ldir -o prog

这成功链接到prog,但是当我启动程序时,Windows 打印出消息,它找不到libdir.dll
所以我的问题是出了什么问题,为什么在运行时不知道libdir.dll 的路径,即使我使用了适当的开关?

假设我有 prog1 和 prog2,每个都包含自己的 libdir.dll 副本,并且它们都开始同时运行在库中加载代码。内存中发生的情况是加载了两个副本还是链接器计算出了这两个程序都有一个副本并使用它吗?
第二个问题是关于如何加载库(任何操作系统)。链接器总是加载整个库还是只加载需要的部分?例如,如果程序引用库中的函数foo(),链接器是否仅映射到该函数或整个库的内存第一个?

【问题讨论】:

    标签: c windows dynamic-linking


    【解决方案1】:

    只有两个真正的选择:将 DLL 与 EXE 放在同一文件夹中,或者将其放在 EXE 的工作目录中。后者不是一个很好的选择,因为您必须创建一个快捷方式来使默认工作目录与包含 EXE 的目录不同。

    仅当您想与其他应用程序共享 DLL 时,不将 DLL 与 EXE 放在同一目录中才有意义。为避免由此导致的不可避免的 DLL 地狱,您需要将 DLL 存储在并行缓存中。创建清单并将其嵌入 EXE 所需的工具以及将 DLL 部署到目标计算机所需的安装程序可能很难通过您的工具链获得。反正很少这样做。

    【讨论】:

    • 能否请您逐步解释一下如何将其放入该.exe 的工作目录以及之后要做什么?
    • 您的意思是“如何创建快捷方式?”右键单击桌面 + 新建。
    【解决方案2】:

    这个问题的一部分是这个问题的副本:Is there a Windows/MSVC equivalent to the -rpath linker flag?

    答案的总结是在 Windows 上没有直接等效的 RPATH。

    由于您排除了将 DLL 放置在默认库搜索路径中(在 Windows 上包括您列出的系统目录和 PATH 环境变量中的目录),因此您可以使用以下选项:

    • 使用批处理文件
    • 将所有 DLL 和可执行文件放在同一目录中
    • 在程序中进行操作系统级调用以添加到 DLL 搜索路径

    【讨论】:

    • 感谢您提供另一个问题的链接。但是,您忘记提及也可以解决问题的清单机制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2019-12-29
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多