使用其他目录中的库构建项目。 Windows, MinGW

Build project with libraries in other directories. Windows, MinGW

我几乎没有别人产品的库,我的库也很少(dll 和 headers)。 为了更好地构建我的项目(并且只是为了增加我的知识),我想将 dll 放在其他目录中(不是带有 exe 的目录)。

据我所知,Windows 仅在 exedir 和 sysdir 中使用 dll(寻找 exe 的 dll)。 此外,存在可以帮助我的注册码,但它是作为 PATH var.

的全球解决方案

1.我可以 link exe 和一些 dll,它放在关于 exe 的较低层次的目录中吗?怎么样?

此外,我想用于此 MinGW。

我找不到关于我的问题的足够信息,我找到了 linker 的 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
但我仍然可以 运行 只有当 dll 放在 exedir 中时才不会出错。

所以,我找到了 -Wl,-rpath,... 的 arg(?) $ORIGIN,据我所知,它是某个 obj 文件的 workdir 的完整路径吗?还是不行?

3。什么是 $ORIGIN? Should\Can我用它来解决我的问题?

对不起我的英语。提前谢谢你。

  1. Can I link exe with some dll, which placed in dir on lower hierarchy about exe? How?

没有。不幸的是,你不能。默认情况下,Windows DLL 搜索路径顺序为 as follows:

  1. 加载应用程序的目录。
  2. 系统目录。使用GetSystemDirectory函数获取该目录的路径。
  3. 16位系统目录。没有获取这个目录路径的函数,但是搜索到了。
  4. Windows目录。使用 GetWindowsDirectory 函数获取此目录的路径。
  5. 当前目录。
  6. PATH 环境变量中列出的目录。

因此,如果您不能将 DLL 放在这些目录之一中,那么自动动态加载将看不到它们。 但是,一个可能的替代方法是在启动 EXE 之前在本地设置 PATH。例如,附加到 PATH 的 BAT 文件然后启动该程序,或者您编写的另一个执行相同操作的程序。

-Wl,-rpath-link,...; -Wl,-rpath,...;

  1. Can I use this keys to solve my problem on Windows with MinGW? How?

没有。这些不适用于 MinGW,将被忽略。 Windows 上没有等效项。与 ELF 二进制文件(例如 Linux)不同,EXE 不支持指定额外的运行时搜索路径。有关详细信息,请参阅 Linking with -R and -rpath switches on Windows and Is there a Windows/MSVC equivalent to the -rpath linker flag?

  1. What is $ORIGIN? Should\Can I use it to solve my problem?

没有。 $ORIGIN 只是一个特殊的标记,本质上只是表示 "the path where this application is located"。来自 the man page for ld:

  $ORIGIN (or equivalently ${ORIGIN})
          This expands to the directory containing the program or shared
          object.  ...

因为 -rpath 对 Windows 不起作用,所以这与这里无关。


因此您必须将 DLL 放在它们的预期位置,或者通过批处理文件或其他先设置 PATH 的程序启动可执行文件。

顺便说一句,如果可以,请不要向 system/user-wide PATH 变量添加任何内容。我知道这很诱人,许多应用程序都这样做,但是 PATH 的污染对用户来说成为一个问题,尤其是当安装了很多具有相同 DLLs/EXEs 版本冲突的应用程序时。