opencv中自带的dll和lib 为啥不能直接使用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv中自带的dll和lib 为啥不能直接使用?相关的知识,希望对你有一定的参考价值。
lib 编译和链接时使用。勿忘相应的头文件。dll 跑程序时使用。 参考技术A 输出的dll和lib都可以使用啊!为啥不能用?我一直用着
为啥dll不能在c++中使用?
【中文标题】为啥dll不能在c++中使用?【英文标题】:Why dll can't be used in c++?为什么dll不能在c++中使用? 【发布时间】:2010-03-28 10:26:30 【问题描述】:这个答案指出了:
Failed to link mysql5.1.39\bin\libmySQL.dll
但我不明白为什么,.dll
与 .lib
基本相同,只是不同进程使用的只有一个副本。
和IDE有关系吗?我用的是visual c++ 2008 express
更新
有人知道在 Windows 中将.dll
转换为.lib
的免费工具吗?
【问题讨论】:
这个问题是多余的。该问题的答案已在 cmets 中得到解答。 但这里的答案非常有益。 【参考方案1】:你在两个方面错了。首先,DLL 和 LIB(静态库)是非常不同的野兽。您正在谈论的 LIB(我认为)是导出库,它只是 DLL 中的名称列表。该库通常在编译 DLL 时生成,如果 DLL 打算由其他开发人员链接到,则该库随 DLL 一起提供。
要在现代 IDE 中使用 DLL(我不使用 VS),您通常在项目中包含匹配的 .LIB(导出库)。在运行时,您必须确保 DLL 可用于您的程序 - 最简单的方法是将 DLL 与可执行文件放在同一目录中。
其次,DLL 可以与 C++ 一起使用。
【讨论】:
@Neil:他在链接库和完全静态库之间混为一谈。 “有帮助”它们具有相同的扩展名。 我手头只有libmySQL.dll
,没有.lib
,所以唯一的出路似乎是可以将dll转换为lib的工具。有没有真正有效的免费工具?
@Mask:如果没有导入库(DLL自带的.lib
),需要使用LoadLibrary
、GetProcAddress
和朋友来加载库(msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx) 并调用其接口函数。【参考方案2】:
DLL 是在运行时加载的特定 Windows 可执行文件。它们在 Linux 中的等价物是 *.so 。 如果您想了解 DLL 和静态库 see here 之间的区别。
【讨论】:
有可靠的工具将dll转换为lib吗? 不,它们有不同的入口点。事实上,静态库是静态的,它有点像主 exe 的“附件”,所以它的入口点就是你的 exe。 DLL 有一个单独的入口点。【参考方案3】:主要原因可能与 dll 文件是链接器 (link.exe) 的输出有关。这个命令行实用程序不知道如何读取 dll,只知道如何编写它们。
实际上,有时 .lib 文件包含的不仅仅是函数列表。例如 libpng.lib 作为独立文件工作,没有任何 dll 文件。
【讨论】:
.lib文件至少有导出库和静态库两种。【参考方案4】:为了在 C/C++ 中使用 DLL,您需要链接所谓的 import lib。这是一个小的 .lib,其中包含 DLL 以链接器可以理解的格式导出的名称/序号。一旦链接进来,生成的二进制文件将能够使用 DLL。如果您没有合适的导入库,您的 C/C++ 编译器应该附带一个从 DLL 生成的工具。
【讨论】:
【参考方案5】:你可以通过下面的类比来理解dll和lib文件的区别。
dll 类似于源 .cpp 文件,而 lib 是头 .h 文件。
虽然这并不完全正确,但 DLL 保存可执行代码,而 LIB 文件告诉链接器如何将代码粘合在一起。
It is also possible (in some cases) to generate the lib from the dll。基本上,调用函数只需要知道 dll 中的函数入口点、参数的数量和每个参数的大小。发送相关信息是您自己的问题。
【讨论】:
有人问过这个问题,但似乎还没有免费且有效的工具:***.com/questions/1536557/…以上是关于opencv中自带的dll和lib 为啥不能直接使用?的主要内容,如果未能解决你的问题,请参考以下文章