【问题标题】:Are there different types of .lib files?有不同类型的 .lib 文件吗?
【发布时间】:2015-12-09 12:27:38
【问题描述】:

我使用 Qt 编译了 minimal example 的代码,并注意到链接到它的 .lib 文件增加了我编译的程序链接到其对应的 .dll 文件的要求。

我想自己创建一个.lib 以供我的其他项目使用,但我想这样做而不必同时创建一个.dll 以使其必须链接到。


来自这个问题的答案:Difference between static and shared libraries?

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

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

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

如果这一观察是正确的,如何编译其中一种类型的 .lib

【问题讨论】:

  • 取决于您的实际工具链。大多数编译器都支持链接器标志,例如 -static-shared
  • 如果您使用 Visual Studio,则选择 DLL 或静态库作为您的项目类型。
  • 在 linux/unix 中你可以使用ar 命令来创建静态库。看看这个:thegeekstuff.com/2010/08/ar-command-examples

标签: c++ dll static-libraries


【解决方案1】:

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

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

另一方面,一个 DLL(一个共享库)有两个部分:包含代码的动态加载库本身 (.dll) 和一个导入库 (.lib) 包含用于满足链接器依赖关系的“存根代码”。您链接到一个导入库(DLL 随附的 .lib 文件),其中包括 DLL 函数的“存根代码”,还将您的可执行文件标记为需要在启动时加载 DLL。

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

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

【讨论】:

  • 我知道这与这个问题有点半无关,但是 c++ 项目使用库.lib 中的代码的唯一方法是包含并使用它的头文件,对吗?我很确定它是这样工作的,但我想确认一下。
  • @Octopod 实际上,是的。从技术上讲,您只需要对计划使用的库中的实体进行正确声明,因此您可以自己编写它们(毕竟,标题包含只是纯文本包含)。但当然,这是一个非常难以维护的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 2019-11-07
  • 2013-08-23
相关资源
最近更新 更多