我的其他人的产品库很少,而我的库(dll和header)很少。 为了更好地构建我的项目(并且只是为了增加我的知识),我想将dll放在其他目录中(而不是带有exe的dir)。
据我所知,Windows仅在exedir和sysdir中使用dll(看dlls for exe)。 此外,存在可以帮助我的regkeys,但它是PATH var。
的全局解决方案1。我可以将exe链接到一些dll,它放在dir中关于exe的较低层次结构吗?怎么样?
另外,我想用这个MinGW。
我发现关于我的问题没有足够的信息,我找到了链接器的g ++密钥:
-Wl,-rpath-link,...; -Wl,-rpath,...
;
2。我可以使用此密钥在MinGW的Windows上解决我的问题吗?怎么样?
我试过这个:
g++ -Wl,-rpath-link,.\out\lib\ -Wl,-rpath,.\lib\ -L .\out\lib\ -l:foolib.dll main.o -o out\main.exe
但是我仍然可以在没有错误的情况下运行exe,只有当dll放在exedir中时。
所以,我发现$ORIGIN
的arg(?)-Wl,-rpath,...
正如我所理解的那样,是某个obj文件的workdir的完整路径?或者不是?
第3。什么是$ ORIGIN?应该\我可以用它来解决我的问题吗?
抱歉我的英文。提前谢谢。
答案 0 :(得分:1)
- 我可以将exe链接到一些dll,这些dll放在关于exe的低层次的dir中吗?怎么样?
醇>
没有。不幸的是,你不能。默认情况下,Windows DLL搜索路径顺序为as follows:
因此,如果您无法将DLL放在其中一个目录中,则自动动态加载将无法看到它们。 但是,可能的替代方法是在启动EXE之前在本地设置PATH
。例如,附加到PATH
的BAT文件然后启动该程序,或者您编写的另一个程序也会执行该程序。
-Wl,-rpath链路,...; -Wl,-rpath,...;
- 我可以使用此键在MinGW的Windows上解决我的问题吗?怎么样?
醇>
没有。这些不适用于MinGW,只会被忽略。在Windows上没有等效的东西。与ELF二进制文件(例如Linux)不同,EXE不支持额外的运行时搜索路径的规范。有关详细信息,请参阅Linking with -R and -rpath switches on Windows和Is there a Windows/MSVC equivalent to the -rpath linker flag?。
- $ ORIGIN是什么?应该\我可以用它来解决我的问题吗?
醇>
没有。 $ORIGIN
只是一个特殊的标记,它基本上只表示该应用程序所在的路径"。来自the man page for ld
:
$ORIGIN (or equivalently ${ORIGIN}) This expands to the directory containing the program or shared object. ...
由于-rpath
无法在Windows上运行,因此这与此无关。
因此,您必须将DLL放在预期的位置,或者通过批处理文件或首先设置PATH
的其他程序启动可执行文件。
顺便说一句,如果您能提供帮助,请不要在系统/用户范围PATH
变量中添加任何内容。我知道这很诱人,许多应用程序都这样做,但是PATH
的污染成为用户的问题,特别是当安装了许多具有相同DLL / EXE的冲突版本的应用程序时。