4

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

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

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

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

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

4

2 回答 2

2

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

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

于 2010-07-17T16:57:40.087 回答
2

这个问题的一部分是这个问题的副本:是否有与 -rpath 链接器标志等效的 Windows/MSVC?

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

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

  • 使用批处理文件
  • 将所有 DLL 和可执行文件放在同一目录中
  • 在您的程序中进行操作系统级调用以添加到 DLL 搜索路径
于 2013-08-21T16:03:24.290 回答