我了解静态和动态链接的概念。众所周知,在Windows平台上,.dll
动态库和.lib
静态库都是动态库。
我的困惑:我做了一个必须使用OpenCV库的项目。基本上,我必须使用以下5个OpenCV库:
-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio
为此,在项目的属性中,我必须告诉编译器Additional Library Directory
VS 2012中的库的路径,还必须告诉链接.lib
程序我要用于项目的库。该项目已编译,没有任何错误。但是,当我尝试运行该项目时,它说该项目videoio.dll
丢失了(其余库也有同样的错误)。一旦我将.dll
文件复制到.exe
存在该文件夹的文件夹中,项目就可以正常运行。
问题:.dll
当我已经链接静态库(.lib
)时,为什么必须复制文件?
进一步的问题:当我在Mac OS或Linux上使用Eclipse时,我只需要告诉编译器OpenCV库在哪里以及链接器我要使用的其他OpenCV库。.exe
在那种情况下,我不必将动态库放到该文件夹中。
Windows“常规”工具链提供了两种“ .lib” .lib。
一种是您提到的静态库。使用时,没有关联的.dll。
另一个是剥离的库,仅可在其中挂接代码以在加载时加载和修复动态库的函数指针。
使用动态库(.dll),您可以自行加载(通过LoadLibrary
),也可以使用.dll附带的存根(导入).lib。支持import .lib(如果提供的话)。
当我已经链接静态库(.lib)时,为什么必须复制.dll文件?
.dll必须位于路径或包含.exe的目录中,以便加载程序可以找到它。
如何区分.lib文件是静态库还是动态库?
通常,文档应包括有关此方面的某种程度的详细信息。如果它们集中在同一文件夹中,那么我将假定.lib与.dll绑定在一起。如果所有其他方法均失败,请查看文件大小;如果.lib绑定到.dll,则与.dll相比,它通常很小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句