我在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环境变量中的目录),因此您将留下以下选项: