链接vs包括文件

时间:2012-02-29 17:52:37

标签: c++ linker

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

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

编辑:根据第一条评论明确说明。这是一个令人困惑的陈述

3 个答案:

答案 0 :(得分:4)

通常,您需要同时执行这两项操作。头文件告诉编译器什么 功能可用,它们看起来像什么。他们必须是 编译时出现。库包含实现,和 必须与应用程序链接才能生成编译器 呼吁工作。

在少数情况下,“库”可能只包含头文件; C ++ 仍然需要在模板中实现模板 标题,而不是在库中,所以一个只包含其他内容的库 模板可能只是标题。在这种情况下,就足够了 包括标题;没有什么可以链接的了。 (当然,这样 图书馆通过屋顶驱动编译时间。)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用库的一个好理由是可以更容易地使用:编译大型代码库,所有正确依赖项必须可用,并且可能需要特定的步骤,与手头的任务。当然,它的编译时间也会被删除。