C++ 链接与包含文件

C++ 链接与包含文件,c++,linker,C++,Linker,当使用大型代码库时,我看到当使用某个对象时,该对象的头文件会被包括在内。在其他时间,该对象的库在生成文件中链接 为什么要这样做。如果他们可以访问源代码,为什么不包括您正在使用其对象的所有文件,而不是链接到其lib*.a文件中 编辑:根据第一条评论明确。这是一个令人困惑的陈述通常,你需要同时做这两件事。头文件告诉编译器什么 功能可用,以及它们的外观。他们一定是 在编译时显示。库包含实现,以及 必须与应用程序链接才能生成编译器 工作电话 在极少数情况下,“库”可能只包含头文件;C++ 仍然需要在 标

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

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


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

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

在极少数情况下,“库”可能只包含头文件;C++ 仍然需要在 标题,而不是在库中,所以库只包含 模板只能是标题。在这种情况下,只需 包括标题;没有更多的链接。(当然是这样
库驱动编译时间。)

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

在极少数情况下,“库”可能只包含头文件;C++ 仍然需要在 标题,而不是在库中,所以库只包含 模板只能是标题。在这种情况下,只需 包括标题;没有更多的链接。(当然是这样
库驱动编译时间。)

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


以Windows为例,使用kernel32.lib中的任何内容都需要很多头文件,但是没有kernel32.h。

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


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

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

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

你说的“头文件在makefile中链接”是什么意思?对象文件是链接的。不是头文件。修复了我的问题。我跳过了IMP描述。我读到了这样的问题:“有些人编译C++文件作为共享对象或DLL,然后将它们链接到他们的代码中,而有些人则使用同一个文件(比如文件.CPP),而不编译它,相反,它们包含“文件CPP”。“在他们的代码中。。。那么,这两种不同的方法访问和使用文件.cpp中的代码的原因是什么?”这就是你要问的吗?是的。这就是我的意思,但不是“某些人”。我看到这发生在同一个代码库中。你说的“头文件链接到makefile中”是什么意思“?对象文件已链接。不是头文件。修复了我的问题。我跳过了IMP描述。我读到了这样的问题:“有些人编译C++文件作为共享对象或DLL,然后将它们链接到他们的代码中,而有些人则使用同一个文件(比如文件.CPP),而不编译它,相反,它们包含“文件CPP”。“在他们的代码中。。。那么,这两种不同的方法访问和使用文件.cpp中的代码的原因是什么呢?“这就是你要问的吗?是的。这就是我的意思,但不是“某些人”。我看到这发生在同一个代码库中。