【问题标题】:Build project with libraries in other directories. Windows, MinGW使用其他目录中的库构建项目。窗口,MinGW
【发布时间】:2017-02-27 23:59:59
【问题描述】:

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

据我所知,Windows 仅在 exedir 和 sysdir 中使用 dll(查找 exe 的 dll)。 此外,存在可以帮助我的 regkeys,但它是 PATH var 的全局解决方案。

1.我可以将 exe 与一些 dll 链接,这些 dll 位于关于 exe 的较低层次结构的 dir 中?怎么样?

另外,我想用于这个 MinGW。

我没有找到关于我的问题的足够信息,我找到了链接器的这个 g++ 键:
-Wl,-rpath-link,...; -Wl,-rpath,...;

2。我可以用这个键在 Windows 上用 MinGW 解决我的问题吗?怎么样?

我试过这个:
g++ -Wl,-rpath-link,.\out\lib\ -Wl,-rpath,.\lib\ -L .\out\lib\ -l:foolib.dll main.o -o out\main.exe
但只有将 dll 放在 exedir 中,我仍然可以运行 exe 而不会出错。

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

3. $ORIGIN 是什么?我应该\我可以用它来解决我的问题吗?

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

【问题讨论】:

    标签: c++ windows gcc dll mingw


    【解决方案1】:
    1. 我可以将 exe 与一些 dll 链接,这些 dll 位于关于 exe 的较低层次结构的 dir 中?怎么样?

    没有。不幸的是,你不能。默认情况下,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. 我可以使用这个密钥来解决我在 Windows 上的 MinGW 问题吗?怎么样?

    没有。这些不适用于 MinGW,只会被忽略。 Windows 上没有等价物。与 ELF 二进制文件(例如 Linux)不同,EXE 不支持额外运行时搜索路径的规范。请参阅Linking with -R and -rpath switches on WindowsIs there a Windows/MSVC equivalent to the -rpath linker flag? 了解更多信息。

    1. 什么是 $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 版本冲突的应用程序时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多