C ++链接不同目录中的第3方dll

C++ Linking 3rd party dll in diffrent directory

我有一个自己的 dll,它使用第 3 方 dll,通过其 lib 文件包含。 如果第 3 方 dll 在工作目录中,编译工作正常并且 运行-time 也可以工作。

但现在我想将第 3 方 dll 移动到另一个文件夹,然后我的 dll 无法加载,因为第 3 方 dll 无法加载,因为找不到它。

我在哪里 (VS2010) 或如何定义应该在 运行 期间使用的第 3 方 dll 的文件夹?

将包含 DLL 的文件夹添加到 PATH 环境变量。

首先我们要区分两种情况:

1) Load-Time Dynamic Linking - 当您 link 您的代码针对存根库解析对 DLL 函数的引用时 link 时间然后系统尝试加载程序启动时的 DLL(如果未找到 DLL 则终止程序)并且您基本上无法控制它。从您所说的来看,您正在使用此选项。

2) Run-Time Dynamic Linking - 当您通过 LoadLibrary/LoadLibraryEx 自行加载 DLL 并在运行时解析所需的符号时。在这里,您可以更好地控制正在发生的事情(除其他事项外,您还可以指定加载内容和加载位置)。如果您需要自定义布局,也许切换到此机制有意义?

那么两种情况都需要发生什么:

1) 系统基本上会在一组预定义的搜索路径中搜索您尝试加载的 DLL 以及它可能依赖的任何 DLL。所以,正如 m.s 所提到的。您可以将包含您的 DLL 的路径附加到 PATH 变量,然后系统将能够找到它。但这只是系统查找 DLL 的地方之一。Here 是一个完整的描述。简而言之,按搜索顺序排列的最重要的地方是:

  • 应用程序加载的目录。
  • 系统目录。
  • Windows 目录。
  • 当前目录。
  • PATH 环境变量中列出的目录。

所以这解释了为什么添加到 PATH 有效并且也被认为是一种正常方法,因为调整当前目录(您可以这样做)可能会造成不良后果。

2) 在这种情况下,您只能靠自己。 LoadLibraryEx gives the ability to alter your search path, by using SetDefaultDllDirectoriesLOAD_WITH_ALTERED_SEARCH_PATH 加载 DLL 和任何依赖项。