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 SetDefaultDllDirectories 或 LOAD_WITH_ALTERED_SEARCH_PATH
加载 DLL 和任何依赖项。
我有一个自己的 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 SetDefaultDllDirectories 或 LOAD_WITH_ALTERED_SEARCH_PATH
加载 DLL 和任何依赖项。