在Windows上与-R和-rpath开关链接

我在Windows XP上使用gcc编译器(MinGW)。我创build了一个.dll库libdir.dll比我试图build立一个使用该库的程序。
我不想把这个.dll文件放到System或System32文件夹中,也不需要在PATHvariables中设置它的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 -dir -o prog

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

比方说,我有prog1和prog2每个包含自己的libdir.dll副本,他们都开始运行在同一时间加载库中的代码。内存中发生的是有两个副本加载或链接器数字出来一个副本,并使用这两个程序?
第二个问题是关于如何加载库(任何操作系统)。连接器总是加载整个库或只需要部分?例如,如果程序引用函数库中的函数foo() ,链接器只映射到内存中的函数或整个库第一?

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

如果您不想将DLL与其他应用程序共享,则不要将该DLL与EXE放在同一个目录中。 为了避免这个造成的不可避免的DLL地狱,你需要将DLL存储在并行缓存中。 您需要创建清单并将其嵌入EXE中的工具以及将DLL部署到目标机器所需的安装程序可能很难通过工具链来实现。 无论如何,这是非常罕见的。

这个问题的一部分是这一个的重复: 是否有一个Windows / MSVC相当于-rpath连接器标志?

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

由于您不能将DLL放在默认的库搜索路径中(Windows上的路径包含您列出的系统目录和PATH环境变量中的目录),因此您将留下以下选项:

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