Visual Studio中的静态链接和动态链接

8

我理解静态链接和动态链接的概念。在Windows平台上,.dll是动态库,而.lib是静态库。

我的困惑:我做了一个项目,需要使用OpenCV库。基本上,我需要使用以下5个OpenCV库:

-lopencv_core
-lopencv_highgui
-lopencv_imgcodecs
-lopencv_imgproc
-lopencv_videoio

为此,在项目属性中,我需要告诉VS2012的编译器要在Additional Library Directory中设置库的路径,并且还要告诉链接器我想在项目中使用哪些.lib库。项目顺利编译通过。但是当我尝试运行这个项目时,它提示说videoio.dll缺失(其他库也有同样的错误)。只要将.dll文件复制到.exe所在的文件夹中,项目就能正常运行。

问题:既然已经链接了静态库(.lib),为什么我还要复制.dll文件呢?

更进一步的问题:当我在Mac OS或Linux上使用Eclipse时,我只需告诉编译器OpenCV库的位置以及要使用哪些其他OpenCV库,我从未需要将动态库放在.exe文件夹中。


1
在VisualStudio中,通常每个.dll文件都会有一个.lib文件。它们与静态库不同,因为它们被称为导入库。您需要这些库来链接您的(动态)dll文件。在OpenCV中,静态库位于“staticlib”文件夹中,而导入库位于“lib”文件夹中。动态库(dll文件)可以在“bin”文件夹中找到。因此,如果您想进行静态链接,您将需要使用“staticlib”目录中的库。 - bweber
1个回答

15

"通常" Windows 工具链提供了两种形式的 .lib。

其中一种是你所提到的静态库。使用时,没有相关的 .dll。

另一种是一个简化的库,只是为了在加载时连接代码并修复动态库的函数指针。

对于动态库(.dll),你可以手动加载它(通过 LoadLibrary)或者使用随附 .dll 的存根(导入).lib。如果提供了导入 .lib,请优先使用该文件。

我已经链接了静态库(.lib),为什么还要复制 .dll 文件?

.dll 需要在路径中,或者与 .exe 在同一目录中,以便 loader 找到它。


如何区分 .lib 文件是静态库还是动态库?

通常文档应该包含一些关于这方面的详细信息。如果它们被放在同一个文件夹中,则我会假设 .lib 与 .dll 相关。如果其他方法都无法确定,那就看文件大小;如果 .lib 与 .dll 相关,则通常比 .dll 小。


жҠұжӯүпјҢжҲ‘дёҚжҳҺзҷҪпјҢжҲ‘еҸӘжңүOpenCVеә“зҡ„.libж–Ү件е’Ң.dllж–Ү件гҖӮжҲ‘иҜҘеҰӮдҪ•еҢәеҲҶ.libж–Ү件жҳҜйқҷжҖҒеә“иҝҳжҳҜеҠЁжҖҒеә“пјҹ - user2756695
1
通常文档应该包含一些关于这个的详细信息。否则,如果它们被放在同一个文件夹中,那么我会认为.lib与.dll是相关联的。如果其他方法都失败了,可以看文件大小。如果.lib与.dll相关联,那么它通常比.dll小。 - Niall
我已经检查了OpenCV的文件夹,其中我使用Visual Studio构建了我的库。在build文件夹中,除了几个文件夹外,我还有binlib文件夹。在lib文件夹中,我有扩展名为.lib.exp的文件。而在bin文件夹中,我有扩展名为.dll.pdb的文件。这是否意味着我根本没有OpenCV的静态库? - user2756695
@user2756695。我怀疑您没有构建静态库,只是带有相关导入库的动态库。 - Niall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接