Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ 如何在Windows 10 Visual Studio中使用所需的“.dll”进行生成_C++_Visual Studio 2015 - Fatal编程技术网

C++ 如何在Windows 10 Visual Studio中使用所需的“.dll”进行生成

C++ 如何在Windows 10 Visual Studio中使用所需的“.dll”进行生成,c++,visual-studio-2015,C++,Visual Studio 2015,我正试图建立一个项目。我有一个.lib文件需要在我的项目中使用。我知道有两种方法可以使用这个库: 使用pragma commentlib,a.lib添加它 将其添加到链接器依赖项配置属性->链接器->输入->其他依赖项 现在,a.lib使用函数DbgHelp。此库以DbgHelp.lib和DbgHelp.dll的形式提供。我知道我可以使用上面列出的两种方法将其用作lib。但是如果我不想把它包含到我的项目中,并且想使用dBGelpult.dll,那么我怎么能在VisualStudio.中这样做,并

我正试图建立一个项目。我有一个.lib文件需要在我的项目中使用。我知道有两种方法可以使用这个库:

使用pragma commentlib,a.lib添加它 将其添加到链接器依赖项配置属性->链接器->输入->其他依赖项
现在,a.lib使用函数DbgHelp。此库以DbgHelp.lib和DbgHelp.dll的形式提供。我知道我可以使用上面列出的两种方法将其用作lib。但是如果我不想把它包含到我的项目中,并且想使用dBGelpult.dll,那么我怎么能在VisualStudio.

中这样做,并且在VisualC++中,使用DLL附带的LIB文件就是所谓的导入库。这意味着图书馆没有实际的职能机构;它只是为了安抚链接器,并指示它生成一个EXE或DLL,在加载时使用第一个DLL

在这种情况下也是如此。由于您无法访问DbgHelp的源代码,因此无法将其构建为真正的静态库,因此需要在链接时使用小型导入库,在加载/运行时使用dll文件

注意:整个链接和动态链接的概念和机制显然比我在这里要讨论的要复杂得多。因此,上面的解释非常狭隘,针对您的问题。

请仔细阅读:

使用.lib与导入库的隐式链接 在这种情况下,静态库是一个导入库,它自动确定DLL中有效函数的过程。这称为隐式动态链接

显式连接 如果不想使用导入库,则必须自行确定所有函数,创建指向过程地址的相应指针,然后使用它们。 通常在客户端代码中有一些InitDLL函数,可以实现这一点

见:

GetProcAddress函数可用于获取该函数的句柄并调用它

这称为显式动态链接,还需要在Windows上调用LoadLibrary和FreeLibrary

更多信息:

Linux上的显式链接
对于linux/unix,工作方式不同。如果要读取:

如果要调用DLL中的函数,但不想链接到为您导入这些函数的库文件,则可以使用LoadLibrary和GetProcAddress。如果您有导入库并且可以链接到它,为什么要手动加载这些函数

如果您有DbgHelp.lib导入库,请使用它!如果不负责任地加载函数,则很容易出错。小心使用

现在,您可以像调用函数StackWalk64一样调用funStackWalk64,并在该位置周围传递函数指针。使用完库后,应释放模块句柄:

FreeLibrary(hDbgHelpDll);

可能是重复的,这里有一个XY阴影问题。为什么不使用DbgHelp.lib?那个导入库的存在是有原因的。谢谢,我现在明白了。那么,如果某个.dll没有相应的导入库some.lib,该怎么办呢?哦,我错过了你问题的这一部分。请看@MABVT的另一个答案,以了解其解释。还需要在Windows上调用LoadLibrary和FreeLibrary。-这就是导入库的基本功能?它如何知道.dll的路径?是的,或多或少,这就是导入库的用途。。。主要区别在于,您可以准确定义何时加载和释放库以及引用哪些函数。在windows上,按如下所述搜索dll:我是OP:。谢谢另外,当我将代码打包到库中时,是否会为.dll生成相应的导入库?对不起,使用我没有看到原始帖子的应用程序。什么意思?如果您创建一个静态库?静态库,如果它使用DLL,仍然需要最终的可执行文件也链接导入库并使DLL可检测。现在我想把它包装成一个动态库my.dll,供其他人使用。但我不希望其他人使用LoadLibrary,所以我需要为他们提供导入库文件my.lib。这个my.lib会与my.dll一起自动生成吗?
FreeLibrary(hDbgHelpDll);