与包含头文件相比,使用静态库有什么好处
What is the benefit to using a static library over including a header file?
如果这是一个很难回答的问题,很抱歉,但它还是在这里。
因此,我遵循了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
库有好处吗?
你的问题有一个错误的二分法。静态库不能替代标头。在我的脑海中,有三种静态库的替代方案。
- 动态库。与可执行文件分离的已编译库,可执行文件在运行时加载
- 一个或多个对象文件。作为编译翻译单元的对象文件(通常是单个编译的c++源文件,但这取决于编译方式)
- 一个或多个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文件或库中找到,该文件或库可以是静态库或动态库。
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 使用什么代替"静态常量 TCHAR *"
- 静态初始化的反义词是什么?
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- 为动态创建的数组使用静态关键字有什么意义吗?
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- 将静态全局变量声明为内联有什么意义吗?
- 使用 openssl 构建静态二进制文件的正确方法是什么?
- 创建静态哨兵节点的正确方法是什么
- constexpr静态成员什么时候停止成为constexpr
- 使用内联静态数据成员有什么潜在的陷阱吗?
- 有什么需要,局部静态变量在编译时分配内存?
- 类中的静态成员变量和C++中的全局变量有什么区别?
- 静态模板类成员函数的这两个调用之间有什么区别?
- 使用静态类成员而不是私有字段之间的速度差异是什么?