C ++在不同目录中链接第三方DLL

时间:2015-06-12 14:37:52

标签: c++ visual-studio-2010 dll

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

首先,我们应区分两种情况:

1)Load-Time Dynamic Linking - 当您将代码链接到存根库以在链接时解析对DLL函数的引用,然后系统尝试在程序启动时加载DLL(并终止程序,如果没有找到DLL),你基本上没有控制。从您所说的内容来看,您正在使用此选项。

2)Run-Time Dynamic Linking - 当您通过LoadLibrary / LoadLibraryEx自己加载DLL并在运行时解析所需的符号。在这里,您可以更好地控制正在发生的事情(在其他方面,您可以指定什么以及从何处加载)。如果您需要自定义布局,可能需要切换到这种机制吗?

因此,两种情况都需要发生什么:

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

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

因此,这解释了为什么添加PATH有效并且也被认为是一种常规方法,因为使用当前目录进行调整(您可以这样做)可以做坏事。

2)在这种情况下,你是独立的。 LoadLibraryEx可以使用SetDefaultDllDirectoriesLOAD_WITH_ALTERED_SEARCH_PATH加载DLL和任何依赖项来更改搜索路径。