gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:28 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com