C++ 有不同类型的.lib文件吗?

C++ 有不同类型的.lib文件吗?,c++,dll,static-libraries,C++,Dll,Static Libraries,我使用Qt编译了大量代码,并注意到链接到它的.lib文件增加了一个要求,即我编译的程序必须链接到它相应的.dll文件 我想自己创建一个.lib供我的另一个项目使用,但不需要创建一个.dll供其链接 从对这个问题的回答来看: 静态库是.a(或在Windows.lib中)文件。所有与库相关的代码都在这个文件中,并且在编译时直接链接到程序中。使用静态库的程序从静态库中复制它使用的代码,并使其成为程序的一部分。[Windows也有用于引用.dll文件的.lib文件,但其作用方式与第一个相同] 我对.l

我使用Qt编译了大量代码,并注意到链接到它的
.lib
文件增加了一个要求,即我编译的程序必须链接到它相应的
.dll
文件

我想自己创建一个
.lib
供我的另一个项目使用,但不需要创建一个
.dll
供其链接


从对这个问题的回答来看:

静态库是.a(或在Windows.lib中)文件。所有与库相关的代码都在这个文件中,并且在编译时直接链接到程序中。使用静态库的程序从静态库中复制它使用的代码,并使其成为程序的一部分。[Windows也有用于引用.dll文件的.lib文件,但其作用方式与第一个相同]

我对
.lib
文件有两种类型的理解是否正确:

  • 将其中的代码复制到编译程序中的一种类型(不需要
    .dll
    链接)
  • 将对
    .dll
    文件的引用添加到编译程序中的一种类型

如果这一观察是正确的,我们将如何编译这些类型之一的
.lib

是的,从这个意义上讲,有两种类型的
.lib
文件。这是特定于Windows(或者更确切地说,是DLL)的

在Windows上,静态库是单个文件,通常扩展名为
.lib
。针对静态库的链接会将其中存储的代码(对象文件)复制到可执行文件中。这相当于Unix世界的
.a
文件

另一方面,DLL(共享库)有两个部分:动态加载的库本身(
.DLL
)包含代码,导入库(
.lib
)包含满足链接器依赖性的某种“存根代码”。您可以针对导入库(DLL附带的
.lib
文件)进行链接,该库包括DLL函数的“存根代码”,还可以将可执行文件标记为需要在启动时加载DLL

在Visual Studio中,可以为每个项目选择项目类型:静态库(将生成
.lib
文件)或动态库(将生成
.dll
文件及其对应的
.lib
文件)


在Unix世界中,其工作方式不同:链接过程中会使用共享库(扩展名
。因此
),这会创建加载程序依赖项。

取决于实际的工具链。大多数编译器支持链接器标志,如
-static
-shared
。如果使用Visual Studio,可以选择DLL或静态库作为项目类型。在linux/unix中,可以使用
ar
命令创建静态库。检查一下:我知道这与这个问题半无关,但是C++项目使用库中的代码> LIB < /C>的唯一方法是通过使用和使用它的头文件,对吗?我很确定它是这样工作的,但我只是想确认一下。@Octopod在实践中,是的。从技术上讲,您只需要为您计划使用的库中的实体提供正确的声明,这样您就可以自己编写它们(毕竟,标题包含只是纯文本包含)。当然,这是一个无法维护的解决方案。