Visual Studio 中的静态和动态链接

2023-11-26

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

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

-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio

为此,在项目的属性中,我必须告诉compiler中的库的路径Additional Library DirectoryVS 2012 我也不得不告诉linker有关.lib我想在该项目中使用的库。该项目已编译,没有任何错误。但是当我尝试运行该项目时,它说videoio.dll丢失(其余库也出现同样的错误)。当我复制了.dll文件夹内的文件.exe在场,项目进展顺利。

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

进一步的问题:当我在 Mac OS 或 Linux 上使用 Eclipse 时,我只需告诉编译器 OpenCV 库所在的位置以及链接器我想要使用哪些其他 OpenCV 库。我从来没有必要把动态库放到.exe在这种情况下的文件夹。


“常用”Windows 工具链提供两种“风格”的 .lib。

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

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

使用动态库(.dll),您可以自己加载它(通过.dll)。LoadLibrary)或者您可以使用随 .dll 一起提供的存根(导入).lib。如果提供了导入 .lib,请优先使用。

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

.dll 需要位于路径或包含 .exe 的目录中,以便加载程序找到它。


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

一般来说,文档应该包含一定程度的详细信息。如果它们集中在同一个文件夹中,那么我会假设 .lib 与 .dll 绑定在一起。如果其他方法都失败,请查看文件大小;如果 .lib 与 .dll 绑定,那么它通常比 .dll 小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 中的静态和动态链接 的相关文章

随机推荐