链接与包含文件

linking vs including a file

本文关键字:文件 包含 链接      更新时间:2023-10-16

当使用大型代码库时,我看到当使用某个对象时,该对象的头文件也包含在内。其他时候,该对象的库会链接到生成文件中。

做这件事的原因是什么。如果他们可以访问源代码,为什么不包括您正在使用的对象的所有文件,而不是链接到他们的lib*.a文件?

编辑:根据第一条评论说得很清楚。这是一个令人困惑的语句

通常,您需要同时执行这两项操作。头文件告诉编译器什么功能可用,以及它们的外观。他们必须编译时显示。库包含实现,以及必须与应用程序链接才能生成编译器工作电话。

在极少数情况下,"库"可能仅由头文件组成;C++仍然需要在头,而不是在库中,所以一个只包含模板只能是头。在这种情况下包括标题;没有什么可联系的了。(当然,这样图书馆将编译时间推向了顶峰。)

头文件和二进制文件之间不一定存在一一对应的关系。事实上,通常没有。例如,仅仅因为你看到foo.h被包括在内并不一定意味着会有foo.obj或foo.lib。反之亦然;即,你可能会看到foo.lib被链接,但没有foo.h

以Windows为例,您需要相当多的头文件才能使用kernel32.lib中的任何内容,但没有kernel32.h。

使用库的一个很好的论据是,它可以更容易地使用:要编译大型代码库,所有右侧依赖项都必须可用,并且可能需要特定的步骤,而这些步骤与手头的任务无关。当然,编译时间也被缩短了。