C++ 如何在VisualStudio中链接dll?

C++ 如何在VisualStudio中链接dll?,c++,visual-studio,dll,dynamic-linking,C++,Visual Studio,Dll,Dynamic Linking,要链接静态库,我必须从.h和.c文件创建.lib。 然后我将它添加到我的项目中,添加其他依赖项并编译 要使用dll,我需要.dll和.lib。这个.lib与上面的相同还是不同? 如何向Visual studio说明如何使用.dll和.lin,而不仅仅是.lib? 我把.dll放在项目目录下,没有任何更改。exe的大小应该是相同的。编译dll项目时,您将得到一个dll和一个LIB文件作为输出。DLL包含实际的库代码;LIB文件包含导出函数的存根,这些函数帮助链接器发出调用该DLL的代码 这与编译静

要链接静态库,我必须从.h和.c文件创建.lib。 然后我将它添加到我的项目中,添加其他依赖项并编译

要使用dll,我需要.dll和.lib。这个.lib与上面的相同还是不同? 如何向Visual studio说明如何使用.dll和.lin,而不仅仅是.lib?
我把.dll放在项目目录下,没有任何更改。exe的大小应该是相同的。编译dll项目时,您将得到一个dll和一个LIB文件作为输出。DLL包含实际的库代码;LIB文件包含导出函数的存根,这些函数帮助链接器发出调用该DLL的代码

这与编译静态库时得到的LIB文件非常不同。该库文件包含组成库的所有目标代码。构建可执行文件时,所有这些代码都会直接链接到可执行文件中,因此是名称的静态部分

然而,实际的使用方式非常相似。无论是链接到动态库还是静态库,都可以使用附加依赖项将链接器指向LIB文件。链接器完成其余工作;它可以从LIB文件中判断它应该做什么

当然,您必须确保它是正确的LIB文件。将DLL和EXE两个项目放在同一个解决方案中,将允许您使用项目引用,使任务基本上万无一失


编辑:当然,除非DLL导出函数,否则在构建DLL时不会获得LIB文件。如果它不导出任何函数,那么该DLL的客户机就没有什么可调用的,因此没有理由使用LIB文件!安排从DLL导出函数的最简单方法是使用uu declspecdllexport注释。如果与宏结合使用,您可以安排它在使用者端解析为_declspecdllimport,从而允许您在构建DLL和从应用程序使用DLL时使用相同的头文件。我的回答中有更多关于这方面的信息。或者,您可以使用。

在编译DLL项目时,您将获得一个DLL和一个LIB文件作为输出。DLL包含实际的库代码;LIB文件包含导出函数的存根,这些函数帮助链接器发出调用该DLL的代码

这与编译静态库时得到的LIB文件非常不同。该库文件包含组成库的所有目标代码。构建可执行文件时,所有这些代码都会直接链接到可执行文件中,因此是名称的静态部分

然而,实际的使用方式非常相似。无论是链接到动态库还是静态库,都可以使用附加依赖项将链接器指向LIB文件。链接器完成其余工作;它可以从LIB文件中判断它应该做什么

当然,您必须确保它是正确的LIB文件。将DLL和EXE两个项目放在同一个解决方案中,将允许您使用项目引用,使任务基本上万无一失


编辑:当然,除非DLL导出函数,否则在构建DLL时不会获得LIB文件。如果它不导出任何函数,那么该DLL的客户机就没有什么可调用的,因此没有理由使用LIB文件!安排从DLL导出函数的最简单方法是使用uu declspecdllexport注释。如果与宏结合使用,您可以安排它在使用者端解析为_declspecdllimport,从而允许您在构建DLL和从应用程序使用DLL时使用相同的头文件。我的回答中有更多关于这方面的信息。或者,您可以使用带有DLL的静态库或小型库,这两种库都需要头文件或显式函数声明。但是,LIB之间的区别是:

动态DLL:LIB类似于头文件,.DLL文件类似于.CPP文件。与包含声明的标头一样,.LIB包含导入定义。就像CPP包含定义一样,.DLL包含实际代码

静态库:就像整个类在.H中实现一样,大多数情况下是在模板中实现的,并且没有附加的.CPP文件-这种库包含程序工作的所有代码。就像,链接器不会抱怨缺少实现。CPP在上述情况下,加载程序操作系统不会抱怨缺少DLL

基于DLL的LIB很小,静态LIB很大,请将.H/.CPP类比放在这里


静态库或带有DLL的小型库都需要头文件或显式函数声明。但是,LIB之间的区别是:

动态DLL:LIB类似于头文件,.DLL文件类似于.CPP文件。与包含声明的标头一样,.LIB包含导入定义。就像CPP包含定义一样,.DLL包含实际代码

静态库:就像整个类在.H中实现一样,大多数情况下是在模板中实现的,没有附加的.CPP-fi le-这种库包含程序运行的所有代码。就像,链接器不会抱怨缺少实现。CPP在上述情况下,加载程序操作系统不会抱怨缺少DLL

基于DLL的LIB很小,静态LIB很大,请将.H/.CPP类比放在这里


DLL项目生成导入库。与静态库不同,它非常小,只声明导出的函数。如果您没有获得.lib文件,则说明您没有正确构建它,或者忘记导出函数。DLL项目仅创建.DLL文件。我找不到任何.lib文件。DLL项目生成导入库。与静态库不同,它非常小,只声明导出的函数。如果您没有获得.lib文件,则说明您没有正确构建它,或者忘记导出函数。DLL项目仅创建.DLL文件。我找不到任何.lib文件从.c和.h文件创建和编译DLL项目后,我只得到了.DLL文件。没有.lib文件,还有一个问题:如何使用现有的预编译.dll,而不使用从托管库的站点下载的.lib文件?我应该使用LoadLibrary和GetProcAddress函数吗?@stark这对我很有用。我执行了以下操作:向解决方案添加一个新项目,并指定Win32项目模板。在向导中,我选择了DLL。我用uu declspecdllexport注释了我希望从DLL导出的所有函数,然后构建了该项目。在输出文件夹中,我得到MyDLL.dll、MyDLL.exp、MyDLL.ilk、MyDLL.lib和MyDLL.pdb。所以我猜你的问题是你没有从DLL导出任何函数。这使得DLL非常无用。有关uu declspecdllexport的更多信息,请参阅。至于关于下载的DLL的第二个问题,如果打算与Microsoft的编译器和链接器一起使用,下载应该包含一个LIB文件。如果没有,则必须使用LoadLibrary和GetProcAddress动态调用函数。也可以手动为DLL创建自己的LIB文件。使用dumpbin/exports获取导出函数的列表,将名称放入DEF文件中,并通过链接器运行它:lib/DEF:MyDef.DEF/OUT:MyLib.libOh谢谢,我将u declspecdllexport放入定义和我需要的函数的所有声明中,它工作了。我注意到uu declspecdlimport必须与object声明一起使用,因为带有extern的object声明不适用于dll,但是函数原型在没有u declspecdlimport的情况下可以正常工作。在从.c和.h文件创建和编译dll项目后,我只得到了.dll文件。没有.lib文件,还有一个问题:如何使用现有的预编译.dll,而不使用从托管库的站点下载的.lib文件?我应该使用LoadLibrary和GetProcAddress函数吗?@stark这对我很有用。我执行了以下操作:向解决方案添加一个新项目,并指定Win32项目模板。在向导中,我选择了DLL。我用uu declspecdllexport注释了我希望从DLL导出的所有函数,然后构建了该项目。在输出文件夹中,我得到MyDLL.dll、MyDLL.exp、MyDLL.ilk、MyDLL.lib和MyDLL.pdb。所以我猜你的问题是你没有从DLL导出任何函数。这使得DLL非常无用。有关uu declspecdllexport的更多信息,请参阅。至于关于下载的DLL的第二个问题,如果打算与Microsoft的编译器和链接器一起使用,下载应该包含一个LIB文件。如果没有,则必须使用LoadLibrary和GetProcAddress动态调用函数。也可以手动为DLL创建自己的LIB文件。使用dumpbin/exports获取导出函数的列表,将名称放入DEF文件中,并通过链接器运行它:lib/DEF:MyDef.DEF/OUT:MyLib.libOh谢谢,我将u declspecdllexport放入定义和我需要的函数的所有声明中,它工作了。我注意到uu declspecdlimport必须与object声明一起使用,因为带有extern的object声明不适用于dll,但是没有u declspecdlimport,函数原型就可以正常工作。