use*_*695 6 c++ dll opencv visual-studio-2012
我理解静态和动态链接的概念.众所周知,在Windows平台上,.dll
是动态库,.lib
是静态库.
我的困惑:我做了一个项目,我必须使用OpenCV库.基本上,我不得不使用以下5个OpenCV库:
-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio
Run Code Online (Sandbox Code Playgroud)
为此,在项目的属性中,我必须告诉编译器Additional Library Directory
VS 2012 中的库的路径,我还必须告诉链接器.lib
我想要用于项目的库.该项目编译没有任何错误.但是,当我尝试运行该项目时,它表示videoio.dll
缺少(其余库也出现相同的错误).一旦我将.dll
文件复制到存在的文件夹中.exe
,项目运行正常.
问题:为什么.dll
我已经链接静态库(.lib
)时必须复制文件?
进一步的问题:当我在Mac OS或Linux上使用Eclipse时,我只需要告诉编译器存在OpenCV库以及链接器我要使用的其他OpenCV库..exe
在这种情况下,我从来没有把动态库放到文件夹中.
Nia*_*all 11
"通常的"Windows工具链提供两种"味道".lib.
一个是你提到的静态库.使用时,没有关联的.dll.
另一个是一个剥离的库,只有在代码中挂钩才能在加载时加载和修复动态库的函数指针.
使用动态库(.dll),您可以自己加载(通过.LoadLibrary
),也可以使用.dll提供的存根(导入).lib.如果提供了一个,则支持导入.lib.
当我已经链接静态库(.lib)时,为什么必须复制.dll文件?
.dll需要位于路径中,或者带有.exe的目录,以便加载程序找到它.
如何区分.lib文件是静态库还是动态库?
通常,文档应该包含一些关于此的详细信息.如果它们被集中在同一个文件夹中,那么我会假设.lib与.dll绑定.如果所有其他方法都失败了,请查看文件大小; 如果.lib绑定到.dll,则与.dll相比通常较小.