使用静态库比包含头文件有什么好处?

What is the benefit to using a static library over including a header file?

很抱歉,如果这是一个菜鸟问题,但无论如何,它就在这里。

所以我在 MSDN 上关注 this tutorial 关于创建和使用静态库的内容。

假设您有一个静态库 fooLib 和一个使用 fooLib

的程序 barExec

根据教程,或者至少是我对它的解释,在 barExec 的源代码中,您必须 #include 用于编译 fooLib 的头文件(fooLib.h,在我的例子中)。

所以我在 barExec 中的代码如下:

// barExec.cpp

#include <iostream>
#include "fooLib.h"

// Rest of my program here.

我的问题是,为什么我首先要费心去创建 fooLib 的所有额外麻烦,尤其是因为我不得不写 fooLib.cpp?当我可以直接 #include "fooLib.h" 时,创建 fooLib 库有好处吗?

头文件只提供函数和变量的声明。它不提供函数的实现和变量的定义。后者可以在另一个.cpp文件或库中找到,可以是静态库也可以是动态库。

你的问题中存在错误的二分法。静态库不能替代 header。在我的脑海中,有 3 个静态库的替代方案。

  1. 一个动态库。与可执行文件分开的已编译库,可执行文件在运行时加载。
  2. 一个或多个 object 个文件。 object 文件是编译的翻译单元(通常是单个编译的 c++ 源文件,尽管它取决于您的编译方式)
  3. 一个或多个 c++ 源文件。

在所有情况下,您仍然需要 header(或者,您可以只声明需要使用的函数和类型,如果没有太多,并且您知道正确的签名).

选项 2 本质上就是静态库。唯一的区别是,object 文件被方便地打包到一个文件中。这使得分发和使用库至少更容易一些。例如,如果您有一个包含 10 个 object 文件的库,您要使用它,链接它可​​能看起来像这样:

g++ main.o foo1.o foo2.o foo3.o foo4.o foo5.o foo6.o foo7.o foo8.o foo9.o foo10.o

而如果将它放在静态库中,链接调用可能看起来简单得多:

g++ main.o -lfoo

选项 3 是选项 2 的前身。如果您有一个或多个 c++ 源文件,在编译它们之后,您将有一个或多个 object 文件(尽管大多数工具链都允许您组合编译和链接合二为一,在这种情况下,磁盘上不会出现 object 个文件)。如果您有一个计划在许多项目中使用的大型库,您可能不想为每个项目都重新编译它。所以你可以选择选项 2。如果这导致很多 object 文件,你可能会发现选择静态库很方便。