什么是静态库的.lib文件,静态链接的dynamic库和dynamic链接的dynamic库?

什么是静态库的.lib文件,静态链接的dynamic库和dynamic链接的dynamic库?

如何在dynamic链接的dynamic库中不需要.lib文件,而且在静态链接中,.lib文件不过是包含所有方法的.obj文件。 那是对的吗?

对于静态库,.lib文件包含库的所有代码和数据。 链接器然后识别它需要的位,并把它们放在最终的可执行文件中。

对于dynamic库,.lib文件包含从库中导出的函数和数据元素的列表,以及有关来自哪个DLL的信息。 当链接器生成最终的可执行文件时,如果使用了库中的任何函数或数据元素,那么链接器会添加一个对DLL的引用(导致它被Windows自动加载),并将条目添加到可执行文件的导入表中对该函数的调用被redirect到该DLL中。

您不需要.lib文件来使用dynamic库,但是没有一个您不能将代码中的函数作为正常函数处理。 相反,您必须手动调用LoadLibrary来加载DLL(和FreeLibrary完成后),然后GetProcAddress获取DLL中的函数或数据项的地址。 然后您必须将返回的地址转换为适当的函数指针以便使用它。

我发现汉斯的以下答案在这里也有用。它清除了可能有两种types的lib文件的空气。

一个LIB文件是用来build立你的程序,它只存在于你的生成机器,你不运送它。 有两种。 静态链接库是一包.obj文件,收集到一个文件中。 链接器在需要parsing外部标识符时从文件中选取任何代码块。

但是更相关的DLL,一个LIB文件也可以是一个导入库。 这是一个简单的小文件,其中包括DLL的名称和DLL导出的所有函数的列表。 您需要在构build使用DLL的程序时将其提供给链接器,以便知道外部标识符实际上是由DLL导出的函数。 链接器使用导入库将条目添加到EXE的导入表中。 然后在运行时,Windows使用它来确定需要加载哪些DLL来运行程序。

在静态库中,lib文件包含库提供的函数的实际目标代码。 在共享版本(你称之为静态链接的dynamic库)中,只有足够的代码可以在运行时build立dynamic链接。

我不确定“dynamic链接dynamic库”(以编程方式加载)。 在这种情况下你甚至可以链接到.lib文件吗?

编辑:

有点晚了,但不,你不链接一个.lib。 那么,你链接到libraryloaderex在它的库。 但是对于你正在使用的实际库,你可以通过C函数指针和loadlibrary来填充你自己的绑定。

这里有一个总结:

链接ǁ静态|  DLL | 调用LoadLibrary
 =========ǁ=============== | ====================== | = ==================
 API代码ǁ在您的com- | 在DLL中 在DLL中
生活ǁ堆积的程序|  |
 ---------ǁ--------------- | ---------------------- |  - ------------------
functionǁ直接,可以| 间接通过表| 间接通过你的
打电话ǁ被删去| 自动填充| 自己的functionptrs
 ---------ǁ--------------- | ---------------------- |  - ------------------
负担ǁ编译器| 编译器/操作系统| 你/ OS

在DLL中的东西就像在一个EXE文件(可以有任何种类的数据,import,出口,读/写/可执行部分),但不同的是,EXE文件只导出入口点(function),但DLL导出/很多function。

链接器读取lib文件,并在执行过程中使用dll文件。 一个lib文件在执行过程中基本上是无用的,一个链接器不能读取一个dll文件(除非可能与这里无关)。

使用lib文件进行静态和dynamic链接的区别可能会让人困惑,但是如果你了解了一些历史,那么它就变得非常清晰了。

最初只有静态库。 对于静态库,.lib文件包含obj文件。 每个obj文件是一个且只有一个编译器源代码input文件的输出。 lib文件只是一个相关obj文件的集合,就像将obj文件放在一个目录中一样。 这实质上是一个lib文件,一个obj文件库。 对于静态链接,可执行文件使用的所有obj文件将合并到一个文件中。 将其与可执行文件与其使用的其他代码分开的文件中的dynamic链接进行比较。

为了实现dynamic链接,Microsoft修改了lib文件的使用,以便它们引用一个dll文件而不是obj文件中的位置。 除此之外,静态链接库中的所有信息与dynamic链接相同。 除了dynamic链接的lib文件指定了dll文件以外,它们和它们中的信息一样。