c++ - Visual Studio 中的静态和动态链接

标签 c++ opencv visual-studio-2012 dll

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

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

-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio

为此,在项目的属性中,我必须告诉编译器库在 VS 2012 的 Additional Library Directory 中的路径,我也必须告诉 linker 我想用于该项目的 .lib 库。该项目编译无误。但是当我尝试运行该项目时,它说 videoio.dll 丢失(其余库也有同样的错误)。只要我将 .dll 文件复制到 .exe 所在的文件夹中,项目就可以正常运行。

问题:为什么我已经链接了静态库(.lib),但还必须复制.dll文件?

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

最佳答案

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

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

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

对于动态库(.dll),您可以自行加载(通过 LoadLibrary),也可以使用 .dll 提供的 stub (导入).lib。如果提供了,请使用 import .lib。

Why did I had to copy the .dll files when I already linked the static libraries (.lib) ?

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


How do I differentiate whether the .lib file is Static library or Dynamic library?

一般来说,文档应该包含一些关于此的详细信息。如果它们集中在同一个文件夹中,那么我会假设 .lib 与 .dll 相关联。如果一切都失败了,请查看文件大小;如果 .lib 绑定(bind)​​到 .dll,那么它通常比 .dll 小。

关于c++ - Visual Studio 中的静态和动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32562242/

相关文章:

c++ - 如何使用具有串行执行顺序的 C++ 线程池

javascript - requestAnimFrame 被多次执行

c++ - c++11 程序可以在任何 CPU 上运行吗?

c++ - 破坏 Glib::RefPtr 会导致 GTK 3 核心中的断言失败

c++ - 如何使用Winsock 2?

c++ - 检查字符串是否包含其他字符串元素

opencv - 从热图计算离散点

opencv - 在 cmakelists.txt android 中添加 opencv

sql - 在 VS2012 和 SSDT 中设置数据库图?

visual-studio - Windows 8 Developer Preview 捆绑了哪个版本的 Visual Studio 11?