我了解静态链接和动态链接的概念。众所周知,在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/