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

2023-12-01

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

第一个-rpath:
gcc -L/路径/到/lib-Wl,-r路径,/路径/到/libmain.o -ldir -o prog

Than -R:
gcc -L/路径/到/lib-Wl,-R,/路径/到/libmain.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 部署到目标计算机所需的安装程序可能很难通过您的工具链获得。无论如何,这种事很少发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows 上使用 -R 和 -rpath 开关进行链接 的相关文章

随机推荐