在Windows上与-R和-rpath交换机链接

时间:2010-07-17 16:48:02

标签: c windows dynamic-linking

我在Windows XP上使用gcc编译器(MinGW)。我创建了一个.dll库libdir.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(),链接器是否只映射到内存中的那个函数或者整个图书馆第一个?

2 个答案:

答案 0 :(得分:2)

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

如果要与其他应用程序共享DLL,则不将DLL放在与EXE相同的目录中。为了避免不可避免的DLL地狱,你需要将DLL存储在并行缓存中。创建清单并将其嵌入EXE所需的工具以及将DLL部署到目标机器所需的安装程序可能很难通过您的工具链实现。反正很少这样做。

答案 1 :(得分:1)

此问题的部分内容与此问题重复:Is there a Windows/MSVC equivalent to the -rpath linker flag?

答案的摘要是在Windows上没有直接等效的RPATH。

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

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