关于C++中的动态链接库

问题描述:

这个问题是关于库的动态链接和应用程序中库的动态链接的使用。关于C++中的动态链接库

例如,我们使用Visual Studio环境使用C++开发应用程序。

这里包含头文件我们其他指定包含目录,并在附加依赖 :Mylibrary.lib 在附加库目录:我们指定库

,并在Windows,我们也有路径“调用LoadLibrary” API用于加载动态链接的库。

我的问题是

  1. 当我们包括其他的依赖库DLL为什么我们应该使用“调用LoadLibrary” API?
  2. 什么时候应该使用“LoadLibrary”API?

谢谢!

想象一下,您有一个软件,例如在确定的时间需要needes将 Internet网络地址转换为字符串。 在Windows vista或更高版本中,您可以使用也可以处理ipv6的“InetNtop”功能,但是如果直接链接到DLL,您的程序将无法在较低的操作系统上运行(例如:Windows XP)。 所以最好的解决方案可能是让2个DLL使用“InetNtop”,另一个使用例如“inet_ntoa”。 然后,根据他安装的操作系统,您的“主”程序将在运行时执行“InetNtop DLL”的LoadLibrary或“inet_ntoa DLL”。

LoadLibrary如果dll不在正在运行的机器上,让您继续执行程序。它返回一个错误状态,可以检查并继续执行。

此外,链接可以让你做其他二进制&其他使用类的东西。 LoadLibrary只允许您通过GetProcAddress查找功能。

+0

其实,还有第三个选项(我真的不建议):延迟加载。有了这个,你可以像使用lib文件一样正常使用dll,但是在加载时不需要,但是在第一次访问时不需要。由于这是由编译器隐式完成的(据我所知),它有点隐藏并导致难以调试的错误。有关更多信息,请参阅http://msdn.microsoft.com/en-us/library/151kt790.aspx。 – 2011-12-22 11:50:04

你问过你可以在其他依赖库中包含dll,然后为什么要使用loadlibrary。

首先让清晰的认识:

虽然静态链接,程序员需要到的.lib文件添加到 附加库的依赖,这是与在编译时主调程序,

然而,Dll是动态加载的,因此当您使用LoadLibrary ie时,您不需要在其他库依赖项中添加dll;如果您明确地链接了Dll,则不需要在其他库依赖项中提供您的dll路径。

请注意:使用LoadLibrary的 您将能够获取Dll句柄,您可以使用GetProcAddress调用导出的函数。

参考: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx