何时包含 .lib 以及何时包含 .dll 或两者都包含

问题描述 投票:0回答:3

我从硬件供应商那里获得了一个 .h 文件、两个 .lib 文件、一个 .dll 文件和一个小型测试项目来与他们的硬件进行对话。

编译并运行他们的测试项目效果很好。值得注意的是:他们不使用 .dll。我可以扔掉 dll 目录及其所有内容,一切正常。

首先,我只需将其代码的通信部分(连接、断开连接和发送命令)复制到我的项目中。这实际上就是您所能做的一切。我已包含 .h 文件并指向包含 .lib 文件的目录。就像在小型测试项目中一样。它全部编译,但是当我尝试运行该项目时,抱怨它缺少 .dll 文件。

任何人都可以解释发生了什么吗? lib 和 dll 应该如何工作?

所有这些都是在windows、VS2005上进行的。我比较了 .vcproj 文件,没有发现任何显着差异。

dll visual-studio-2005 linker
3个回答
2
投票

测试项目是静态链接的-lib包含在exe中。

您的项目是动态链接的 - DLL 被引用,因此在运行时需要。

请参阅此堆栈溢出问题以获取更多信息。


2
投票

基本上,答案取决于您是否要为可执行文件使用静态链接或动态链接。

使用静态链接,您需要 .h 和 .lib 文件,但不需要 .dll 文件来编译和链接。您的可执行文件会更大,但在运行时您不需要任何 .h/.lib/.dll 文件。

使用动态链接,您只需要编译和链接.h 文件。您的可执行文件会更小,但在运行时您将需要一个或两个 .dll 文件。

有关从 Visual Studio 角度对此进行更详细的处理,请查看 http://msdn.microsoft.com/en-us/library/1ez7dh12.aspx -

“动态链接与静态链接的不同之处在于,动态链接允许可执行模块(.dll 或 .exe 文件)仅包含运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有引用的函数,并将其与代码一起放入可执行文件中。”


0
投票

实际上,DLL 在 Windows 上如何工作的正确答案如下:

静态链接时,您仅链接到.lib库文件,其中包含库的所有代码。

动态链接时,您将链接到编译器生成的 .lib 存档文件以及 .dll。它具有符号及其 DLL 地址,因此链接器知道在哪里可以找到它们。然后,您在运行时需要 .dll 文件,因为那是实际代码所在的位置。您不需要 .lib 存档文件,除非您正在进行动态模块加载。在这种情况下,您需要 .lib 存档文件和 .dll 文件。

为动态库生成的 .lib 文件与为静态库生成的 .lib 文件不同。它们不可互换。

© www.soinside.com 2019 - 2024. All rights reserved.