很抱歉,如果这是一个愚蠢的问题,但无论如何它都在这里。
所以我在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
库有什么好处吗?
答案 0 :(得分:4)
你的问题中存在错误的二分法。静态库不是标头的替代品。除了我的头脑之外,还有3个静态库的替代品。
在所有情况下,您仍然需要标题(或者,您可以只声明需要使用的函数和类型,如果没有太多,并且您知道正确的签名)。
选项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文件或库中找到,它可以是静态库或动态库。