【问题标题】:Static and Dynamic linking in Visual studioVisual Studio 中的静态和动态链接
【发布时间】:2015-09-14 10:12:13
【问题描述】:

我了解静态和动态链接的概念。众所周知,在Windows平台上,.dll是动态库,.lib是静态库。

我的困惑:我做了一个项目,我必须在其中使用 OpenCV 库。基本上,我不得不使用以下 5 个 OpenCV 库:

-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio

为此,在项目的属性中,我必须告诉 compiler VS 2012 的 Additional Library Directory 中的库路径,我还必须告诉 linker 关于我想用于项目的.lib 库。该项目编译没有任何错误。但是当我尝试运行该项目时,它说缺少videoio.dll(其他库也有同样的错误)。一旦我将.dll 文件复制到存在.exe 的文件夹中,项目就运行良好。

问题:我已经链接了静态库 (.lib),为什么还要复制 .dll 文件?

进一步的问题:当我在 Mac OS 或 Linux 上使用 Eclipse 时,我只需要告诉编译器 OpenCV 库在哪里,并告诉链接器我想使用哪些其他 OpenCV 库。在这种情况下,我不必将动态库放到 .exe 文件夹中。

【问题讨论】:

  • 在 VisualStudio 中,每个 .dll 文件通常都有一个 .lib 文件。这些与静态库不同,因为它们被称为导入库。你需要那些链接你的(动态)dll。在 OpenCV 中,静态库位于 staticlib 文件夹中,而导入库位于 lib 文件夹中。动态库 (dll) 可以在 bin 文件夹中找到。因此,如果您想静态链接,则必须使用 staticlib 目录中的库。

标签: c++ opencv visual-studio-2012 dll


【解决方案1】:

“通常”的 windows 工具链提供了两种“风格”的 .lib。

一个是你提到的静态库。使用时,没有关联的.dll。

另一个是一个剥离的库,它只是在代码中挂钩,以便在加载时加载和修复动态库的函数指针。

使用动态库(.dll),您可以自行加载(通过。LoadLibrary),也可以使用随 .dll 提供的存根(导入).lib。如果提供了 import .lib,请优先考虑。

当我已经链接了静态库 (.lib) 时,为什么我必须复制 .dll 文件?

.dll 需要在路径中,或者在带有 .exe 的目录中,以便加载程序找到它。


如何区分.lib文件是静态库还是动态库?​​

通常,文档应包含有关此内容的某种程度的详细信息。如果它们集中在同一个文件夹中,那么我会假设 .lib 与 .dll 相关联。如果一切都失败了,请查看文件大小;如果 .lib 绑定​​到 .dll,那么它通常比 .dll 小。

【讨论】:

  • 对不起,我不明白,我只有 .lib 文件和 .dll 文件用于 OpenCV 库。如何区分.lib文件是静态库还是动态库?​​
  • 一般来说,文档应该包含一些关于这个的细节。否则,如果它们集中在同一个文件夹中,那么我会假设 .lib 与 .dll 相关联。如果一切都失败了,文件大小。如果 .lib 绑定​​到 .dll,那么它通常比 .dll 小。
  • 我已经检查了 OpenCV 的文件夹,我在其中使用 Visual Studio 构建了我的库。在build 文件夹中,在几个文件夹中,我也有bin 和lib 文件夹。在lib 文件夹中,我有扩展名为.lib 和.exp 的文件。而且,在bin 文件夹中,我有扩展名为.dll 和.pdb 的文件。这是否意味着我根本没有 OpenCV 的静态库?
  • @user2756695。我怀疑你没有构建静态库,只构建了带有相关导入库的动态库。
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多