静态库,但我还需要标题?

时间:2010-04-10 02:43:51

标签: c++ linker static-libraries

我有很多项目都可以共享一个“常见的”静态类库。

令我困惑的是,如果我从这些类中创建一个静态库并在我的项目中链接它,我仍然需要在我的主项目中的静态库中的类的标题。

那么静态库有什么好处呢?

像Adobe这样的公司如何处理这个?

3 个答案:

答案 0 :(得分:37)

静态库允许您创建库并在许多项目中使用该库。

需要头文件:

由于使用库的项目是独立于库编程和编译的,因此该程序需要知道您正在使用的事物的声明。否则你的编译器如何知道你正在编写有效的代码?

编译器仅将源代码作为输入并生成输出。它不处理输入时编译的目标文件或静态库。

需要在图书馆中进行链接:

因此,使用标题可以在项目中编写有效的代码,但是当涉及链接时,您需要提供静态库中包含的定义。

链接器获取所有目标文件(已编译的代码)以及所有静态库,并生成可执行文件或二进制文件。

有关静态库的更多信息(优势,比较动态等等):

除此之外,将项目分成库是很好的,这样你就不会得到一个巨大的整体项目。

您不需要以这种方式分发源代码(通常在.cpp文件中)。

如果您只是在每个使用公共库的项目中包含所有.cpp文件,则每次都必须编译.cpp文件。

静态库优于动态库的一个优点是,您始终可以确保您的程序是自包含的,并且它们正在使用正确的库版本(因为它们被编译到可执行文件本身)。与动态链接相比,您还具有轻微的速度优势。

静态库相对于动态库的缺点包括您的文件大小会更大,因为每个可执行文件都需要自己的副本,并且您不能交换不同版本的库,因为它不是动态加载的。

回答你的问题:公司如何处理这个问题:

一家典型的公司将广泛使用静态和动态库。

答案 1 :(得分:2)

使用静态库的典型方法是在Makefile(或您使用的任何构建系统)中创建一个目标,该目标在安装库的同时将标头安装到适当的位置。

因此,您的静态库最终会出现在/ usr / local / lib中,并且标题会进入/ usr / local / include或wherever。

答案 2 :(得分:0)

此外,与链接目标文件相比,与静态库链接可能会导致较小的最终可执行文件。原因是,如果不调用特定目标文件(包含在静态库中)中的任何函数,链接器将不会在最终可执行文件中包含这些函数的代码。见Extraneous Library Linkage