Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;链接不同目录中的第三方dll_C++_Visual Studio 2010_Dll - Fatal编程技术网

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

C++ C++;链接不同目录中的第三方dll,c++,visual-studio-2010,dll,C++,Visual Studio 2010,Dll,我有一个自己的dll,它使用第三方dll,包括通过其lib文件。 如果第三方dll位于工作目录中,编译工作正常,运行时工作正常 但是现在我想将第三方dll移动到另一个文件夹中,然后我的dll无法加载,因为第三方dll无法加载,因为找不到它 在何处(VS2010)或如何定义运行时应使用的第三方dll的文件夹?将包含dll的文件夹添加到路径环境变量。首先,我们应该区分两种情况: 1) -当您将代码链接到存根库,以在链接时解析对DLL函数的引用,然后当程序启动时系统尝试加载DLL(如果找不到DLL,则

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

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


在何处(VS2010)或如何定义运行时应使用的第三方dll的文件夹?

将包含dll的文件夹添加到
路径
环境变量。

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

1) -当您将代码链接到存根库,以在链接时解析对DLL函数的引用,然后当程序启动时系统尝试加载DLL(如果找不到DLL,则终止程序),而您基本上无法控制。从你所说的判断,你正在使用这个选项

2) -当您自己通过
LoadLibrary
/
LoadLibraryEx
加载DLL并在运行时解析所需的符号时。在这里,您可以更好地控制正在发生的事情(在其他事情中,您可以指定加载内容和从何处加载)。如果您需要自定义布局,那么切换到此机制可能有意义

那么,要使这两种方案都起作用,需要做些什么:

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

  • 从中加载应用程序的目录
  • 系统目录
  • Windows目录
  • 当前目录
  • PATH环境变量中列出的目录
因此,这解释了为什么添加到
PATH
会起作用,也被认为是一种正常的方法,因为调整当前目录(您可以这样做)可能会产生不良影响


2) 在这种情况下,您只能靠自己。通过使用或
LOAD\u WITH\u alterned\u search\u path
在运行时加载DLL和任何依赖项,可以更改搜索路径。

?怎么做?为什么在运行时要这样做?只需在启动程序之前执行此操作,因为它不仅在我的机器上运行,而且在客户的机器上运行。所以我可以在安装过程中这样做?@GernotLepej是的,你应该在安装过程中这样做。详细信息取决于您使用的安装机制。是否可以通过dll的lib文件使用dll并执行运行时动态链接?@GernotLepej-您不需要
lib
文件。您要做的是将
LoadLibraryEx
与dll文件名一起使用,然后调用
GetProcAddress
以获取指向所需函数的指针,并以与使用
lib
文件时调用函数相同的方式调用这些指针。MSDN在这里有一个很好的例子-