我理解静态和动态链接的概念。据了解,在Windows平台上,.dll
是动态库和.lib
是静态库。
我的困惑:我做了一个必须使用 OpenCV 库的项目。基本上,我必须使用以下 5 个 OpenCV 库:
-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio
为此,在项目的属性中,我必须告诉compiler中的库的路径Additional Library Directory
VS 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(使用前将#替换为@)