使用静态库比包含头文件有什么好处?
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 个静态库的替代方案。
- 一个动态库。与可执行文件分开的已编译库,可执行文件在运行时加载。
- 一个或多个 object 个文件。 object 文件是编译的翻译单元(通常是单个编译的 c++ 源文件,尽管它取决于您的编译方式)
- 一个或多个 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 文件,你可能会发现选择静态库很方便。
很抱歉,如果这是一个菜鸟问题,但无论如何,它就在这里。
所以我在 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 个静态库的替代方案。
- 一个动态库。与可执行文件分开的已编译库,可执行文件在运行时加载。
- 一个或多个 object 个文件。 object 文件是编译的翻译单元(通常是单个编译的 c++ 源文件,尽管它取决于您的编译方式)
- 一个或多个 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 文件,你可能会发现选择静态库很方便。