Visual Studio中的静态和动态链接

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相比通常较小.