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

时间:2015-11-21 06:27:44

标签: c++ static-libraries

很抱歉,如果这是一个愚蠢的问题,但无论如何它都在这里。

所以我在MSDN上关注了创建和使用静态库的this tutorial

我们假设你有一个使用fooLib的静态库barExec和一个程序fooLib

根据教程,或者至少我对它的解释,在barExec的源代码中,你必须#include用于编译fooLib的头文件({{1}在我的情况下)。

所以我在fooLib.h中的代码如下:

barExec

我的问题是,为什么我要首先考虑创建// barExec.cpp #include <iostream> #include "fooLib.h" // Rest of my program here. 的所有额外麻烦,特别是因为我不得不写fooLib?我可以直接fooLib.cpp直接创建fooLib库有什么好处吗?

2 个答案:

答案 0 :(得分:4)

你的问题中存在错误的二分法。静态库不是标头的替代品。除了我的头脑之外,还有3个静态库的替代品。

  1. 动态库。与可执行文件分开的编译库,在运行时加载。
  2. 一个或多个目标文件。目标文件是已编译的转换单元(通常是单个已编译的c ++源文件,但它取决于您的编译方式)
  3. 一个或多个c ++源文件。
  4. 在所有情况下,您仍然需要标题(或者,您可以只声明需要使用的函数和类型,如果没有太多,并且您知道正确的签名)。

    选项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.如果这会导致大量目标文件,您可能会发现选择静态库很方便。

答案 1 :(得分:0)

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