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

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

本文关键字:静态 什么 文件 包含头      更新时间:2023-10-16

如果这是一个很难回答的问题,很抱歉,但它还是在这里。

因此,我遵循了MSDN上关于创建和使用静态库的教程。

假设您有一个静态库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库有好处吗?

你的问题有一个错误的二分法。静态库不能替代标头。在我的脑海中,有三种静态库的替代方案。

  1. 动态库。与可执行文件分离的已编译库,可执行文件在运行时加载
  2. 一个或多个对象文件。作为编译翻译单元的对象文件(通常是单个编译的c++源文件,但这取决于编译方式)
  3. 一个或多个c++源文件

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

选项2本质上就是静态库。唯一的区别是,对象文件可以方便地打包到一个文件中。这使得分发和使用库至少稍微容易一些。例如,如果你有一个库,其中有10个你想要使用的对象文件,那么链接它可能看起来像这样:

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++源文件,在编译它们之后,您将有一个或者多个对象文件(尽管大多数工具链允许您将编译和链接合并到一个步骤中,在这种情况下,磁盘上不会出现对象文件)。如果您有一个计划在许多项目中使用的大型库,您可能不想为每个项目重新编译它。因此,您可以选择选项2。如果这导致了大量的对象文件,您可能会发现选择静态库很方便。

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