为啥dll不能在c++中使用?

Posted

技术标签:

【中文标题】为啥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),需要使用LoadLibraryGetProcAddress和朋友来加载库(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/…

以上是关于为啥dll不能在c++中使用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以在EXE上编译DLL却不能编译

为啥C++的exe文件在另一台计算机无法运行?

从 C++ dll 编组导出的字符串向量

为啥类库 (dll) 也不生成 lib 文件?

为啥 ntdll.dll 会使我的 c++ 可执行文件崩溃?

我如何调试在外部 C# 应用程序中 SWIGed 的 C++ DLL(不能从调试器启动)