在Windows上使用-R和-rpath开关链接

问题描述:

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

首先-rpath:
GCC -L /路径/到/ lib中-Wl,-rpath, /路径/到/ lib中main.o -Ldir -o PROG

比-R:
GCC -L /路径/到/ lib中-Wl,-R, /路径/到/ lib中main.o -Ldir -o PROG

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

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

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

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

+0

可以哟你请一步一步向我解释如何将它放在该.exe的工作目录中,然后该怎么做? – paleman 2010-07-17 17:25:09

+0

你的意思是“如何创建一个快捷方式?”右键单击桌面+新建。 – 2010-07-17 17:32:17

+0

我以为你说的是​​别的,新的头脑。 – paleman 2010-07-17 17:53:08

部分是本项目重复:Is there a Windows/MSVC equivalent to the -rpath linker flag?

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

既然你排除放置在默认的库搜索路径您的DLL(这在Windows上包括您列出的系统目录,并在PATH环境变量中的目录),如果只剩下这些选项:

  • 使用批处理文件
  • 放置在同一个目录
  • 所有的DLL和可执行文件在你的程序制作OS级别*呼吁增加了DLL搜索路径
+0

感谢您提供另一个问题的链接。然而,你忘记提到可能也有窍门的显式机制。 – scrutari 2016-12-21 08:53:30