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

我在Windows XP上使用gcc编译器(MinGW)。我创建了一个.dll库
libdir.dll
而不是我试图构建一个使用该库的程序。 我不想将.dll文件放入System或System32文件夹,也不想在PATH变量中设置它的路径,我想要的是将该信息提供给程序本身。 我知道有一个
-R
-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()
在库中,链接器是否只将该函数或整个库映射到内存中?     
已邀请:
只有两个真正的替代方案:将DLL放在与EXE相同的文件夹中,或者将其放在EXE的工作目录中。后者不是一个选项,因为您必须创建一个快捷方式,使默认工作目录与包含EXE的目录不同。 如果要与其他应用程序共享DLL,则不将DLL放在与EXE相同的目录中。为了避免不可避免的DLL地狱,你需要将DLL存储在并行缓存中。创建清单并将其嵌入EXE所需的工具以及将DLL部署到目标机器所需的安装程序可能很难通过您的工具链实现。反正很少这样做。     
这个问题的一部分是这个问题的重复:是否有一个等同于-rpath链接器标志的Windows / MSVC? 答案的摘要是在Windows上没有直接等效的RPATH。 由于您排除了将DLL放在默认库搜索路径中(在Windows上包含您列出的系统目录和PATH环境变量中的目录),因此您可以选择以下选项: 使用批处理文件 将所有DLL和可执行文件放在同一目录中 在程序中进行OS级调用以添加到DLL搜索路径     

要回复问题请先登录注册